diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b6edc16..71c6789a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ See [standard-version](https://github.com/conventional-changelog/standard-versio The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [0.1.1] (2026-04-28) + +### Features + +- **Transaction parse endpoint**: Added `POST /v1/transaction/parse` and `POST /v1/rc/transaction/parse` endpoints to decode raw transactions without executing or submitting them. Returns the decoded pallet/method, call arguments, signature info, nonce, tip, era, and hash. Note: These endpoints use the chain's current metadata, so transactions from older runtime versions may fail to decode. + +### Refactor + +- **Shared transaction extension types**: Extracted `CheckNonce`, `ChargeTransactionPayment`, and `ChargeAssetTxPayment` types into a shared `utils/transaction_extensions` module to eliminate duplication between block processing and transaction parsing. + ## [0.1.0] (2026-04-07) First stable release of `polkadot-rest-api`. diff --git a/Cargo.lock b/Cargo.lock index 22968e36..a1b87ae5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2633,7 +2633,7 @@ dependencies = [ [[package]] name = "integration_tests" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "colored", @@ -3545,7 +3545,7 @@ dependencies = [ [[package]] name = "polkadot-rest-api" -version = "0.1.0" +version = "0.1.1" dependencies = [ "axum", "frame-decode", @@ -3600,7 +3600,7 @@ dependencies = [ [[package]] name = "polkadot-rest-api-config" -version = "0.1.0" +version = "0.1.1" dependencies = [ "clap", "dotenv", diff --git a/Cargo.toml b/Cargo.toml index 5b5abdb2..9de80e21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ members = [ ] [workspace.package] -version = "0.1.0" +version = "0.1.1" edition = "2024" authors = ["Parity Technologies "] license = "GPL-3.0-or-later" diff --git a/crates/integration_tests/Cargo.toml b/crates/integration_tests/Cargo.toml index a7877a37..6828e5e3 100644 --- a/crates/integration_tests/Cargo.toml +++ b/crates/integration_tests/Cargo.toml @@ -39,7 +39,7 @@ serde_json = "1.0" anyhow = "1.0" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } -polkadot-rest-api-config = { path = "../config", version = "0.1.0" } +polkadot-rest-api-config = { path = "../config", version = "0.1.1" } serde_urlencoded = "0.7" futures = "0.3" jsonrpsee = { version = "0.24.10", features = ["ws-client"] } diff --git a/crates/server/Cargo.toml b/crates/server/Cargo.toml index 2078d2fe..66a571f7 100644 --- a/crates/server/Cargo.toml +++ b/crates/server/Cargo.toml @@ -26,7 +26,7 @@ tower = "0.5" tower-http = { version = "0.6.6", features = ["trace", "cors", "limit", "normalize-path"] } include_dir = "0.7" socket2 = "0.6" -polkadot-rest-api-config = { path = "../config", version = "0.1.0" } +polkadot-rest-api-config = { path = "../config", version = "0.1.1" } subxt = { version = "0.50.0-beta.4", features = ["reconnecting-rpc-client"] } subxt-rpcs = { version = "0.50.0-beta.4", features = ["reconnecting-rpc-client"] } subxt-metadata = "=0.50.0-beta.4" diff --git a/crates/server/src/openapi.rs b/crates/server/src/openapi.rs index 0beb9fd4..44ad75aa 100644 --- a/crates/server/src/openapi.rs +++ b/crates/server/src/openapi.rs @@ -7,7 +7,7 @@ use utoipa::OpenApi; #[openapi( info( title = "Polkadot REST API", - version = "0.1.0", + version = "0.1.1", description = "High-performance Rust REST API for Substrate/Polkadot blockchain data. Drop-in replacement for substrate-api-sidecar.", license(name = "GPL-3.0-or-later"), contact(url = "https://github.com/paritytech/polkadot-rest-api") diff --git a/docs/dist/bundle.js b/docs/dist/bundle.js index 1f88a1e5..3a7a49fb 100644 --- a/docs/dist/bundle.js +++ b/docs/dist/bundle.js @@ -1,2 +1,2 @@ /*! For license information please see bundle.js.LICENSE.txt */ -(()=>{"use strict";var e={365(e,n,t){t.d(n,{A:()=>s});var r=t(601),a=t.n(r),o=t(314),i=t.n(o)()(a());i.push([e.id,"/* Component-specific styles for Polkadot REST API Documentation */\n\n/* Feature Icons - Clean Modern Design */\n.feature-icon {\n width: 48px;\n height: 48px;\n border-radius: var(--radius-lg);\n margin-bottom: var(--spacing-lg);\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.feature-icon::after {\n content: '';\n width: 24px;\n height: 24px;\n border-radius: var(--radius-sm);\n background-color: rgba(255, 255, 255, 0.2);\n}\n\n.account-icon {\n background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);\n}\n\n.block-icon {\n background: linear-gradient(135deg, #10b981 0%, #047857 100%);\n}\n\n.runtime-icon {\n background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);\n}\n\n.transaction-icon {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n}\n\n/* Notice Box Improvements */\n.notice-box {\n padding: var(--spacing-lg);\n border-radius: var(--radius-md);\n border-left: 4px solid var(--accent-primary);\n background-color: rgba(88, 166, 255, 0.1);\n margin: var(--spacing-xl) 0;\n}\n\n.notice-box.info {\n border-left-color: var(--accent-primary);\n background-color: rgba(88, 166, 255, 0.08);\n}\n\n.notice-box .notice-content {\n margin: 0;\n}\n\n/* Navigation Components */\n.nav-menu {\n margin-bottom: var(--spacing-2xl);\n}\n\n.nav-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-md) var(--spacing-xl);\n cursor: pointer;\n transition: background-color var(--transition-fast);\n border-radius: var(--radius-sm);\n margin: 0 var(--spacing-md);\n}\n\n.nav-section-header h3 {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n margin: 0;\n flex: 1;\n}\n\n/* Clean up nav links */\n.nav-link {\n display: flex;\n align-items: center;\n padding: var(--spacing-md) var(--spacing-xl);\n color: var(--text-secondary);\n text-decoration: none;\n border-radius: var(--radius-sm);\n margin: 0 var(--spacing-md) var(--spacing-xs) var(--spacing-md);\n transition: all var(--transition-fast);\n font-weight: var(--font-weight-normal);\n}\n\n.nav-link:hover {\n background-color: var(--bg-hover);\n color: var(--text-primary);\n text-decoration: none;\n}\n\n.nav-link.active {\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n}\n\n.nav-link.active:hover {\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n}\n\n.nav-section {\n margin-bottom: var(--spacing-xl);\n}\n\n/* Improve feature cards */\n.features-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: var(--spacing-xl);\n margin-top: var(--spacing-xl);\n}\n\n.feature-card {\n padding: var(--spacing-2xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n transition: all var(--transition-fast);\n}\n\n.feature-card:hover {\n border-color: var(--accent-primary);\n transform: translateY(-2px);\n box-shadow: var(--shadow-lg);\n}\n\n.feature-card h3 {\n color: var(--text-primary);\n font-weight: var(--font-weight-semibold);\n margin-bottom: var(--spacing-md);\n}\n\n.feature-card p {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin: 0;\n}\n\n/* Improve main content spacing */\n.section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-4xl);\n padding: var(--spacing-2xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n}\n\n.section-header h1 {\n font-size: var(--font-size-4xl);\n font-weight: var(--font-weight-bold);\n color: var(--text-primary);\n margin: 0;\n}\n\n.section-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-lg);\n}\n\n.version-badge {\n display: inline-flex;\n align-items: center;\n padding: var(--spacing-xs) var(--spacing-md);\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-md);\n}\n\n.github-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-md);\n color: var(--text-secondary);\n text-decoration: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n transition: all var(--transition-fast);\n}\n\n.github-link:hover {\n color: var(--text-primary);\n border-color: var(--accent-primary);\n text-decoration: none;\n}\n\n.overview-content {\n max-width: 800px;\n}\n\n.lead {\n font-size: var(--font-size-xl);\n color: var(--text-primary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-3xl);\n}\n\n/* Guide content spacing */\n.guide-content {\n max-width: 800px;\n}\n\n.guide-content h1 {\n font-size: var(--font-size-3xl);\n font-weight: var(--font-weight-bold);\n color: var(--text-primary);\n margin: var(--spacing-4xl) 0 var(--spacing-xl) 0;\n}\n\n.guide-content h1:first-child {\n margin-top: 0;\n}\n\n.guide-content h2 {\n font-size: var(--font-size-2xl);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: var(--spacing-3xl) 0 var(--spacing-lg) 0;\n padding-bottom: var(--spacing-sm);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.guide-content h3 {\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: var(--spacing-2xl) 0 var(--spacing-md) 0;\n}\n\n.guide-content h4 {\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n margin: var(--spacing-xl) 0 var(--spacing-sm) 0;\n}\n\n.guide-content p {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-lg);\n}\n\n.guide-content ul,\n.guide-content ol {\n margin: var(--spacing-lg) 0;\n padding-left: var(--spacing-2xl);\n}\n\n.guide-content li {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-sm);\n}\n\n.guide-content .code-block {\n margin: var(--spacing-xl) 0;\n}\n\n.guide-content .notice-box {\n margin: var(--spacing-xl) 0;\n}\n\n.guide-content blockquote {\n border-left: 4px solid var(--accent-primary);\n padding-left: var(--spacing-lg);\n margin: var(--spacing-xl) 0;\n font-style: italic;\n color: var(--text-secondary);\n}\n\n/* Specification content spacing - same as guide content */\n.spec-content {\n max-width: 800px;\n}\n\n.spec-content h1 {\n font-size: var(--font-size-3xl);\n font-weight: var(--font-weight-bold);\n color: var(--text-primary);\n margin: var(--spacing-4xl) 0 var(--spacing-xl) 0;\n}\n\n.spec-content h1:first-child {\n margin-top: 0;\n}\n\n.spec-content h2 {\n font-size: var(--font-size-2xl);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: var(--spacing-3xl) 0 var(--spacing-lg) 0;\n padding-bottom: var(--spacing-sm);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.spec-content h3 {\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: var(--spacing-2xl) 0 var(--spacing-md) 0;\n}\n\n.spec-content h4 {\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n margin: var(--spacing-xl) 0 var(--spacing-sm) 0;\n}\n\n.spec-content p {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-lg);\n}\n\n.spec-content ul,\n.spec-content ol {\n margin: var(--spacing-lg) 0;\n padding-left: var(--spacing-2xl);\n}\n\n.spec-content li {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-sm);\n}\n\n.spec-content .code-block {\n margin: var(--spacing-xl) 0;\n}\n\n.spec-content .notice-box {\n margin: var(--spacing-xl) 0;\n}\n\n.spec-content blockquote {\n border-left: 4px solid var(--accent-primary);\n padding-left: var(--spacing-lg);\n margin: var(--spacing-xl) 0;\n font-style: italic;\n color: var(--text-secondary);\n}\n\n.nav-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-md) var(--spacing-xl);\n cursor: pointer;\n transition: background-color var(--transition-fast);\n border-radius: var(--radius-sm);\n margin: 0 var(--spacing-md);\n}\n\n.nav-section-header:hover {\n background-color: var(--bg-hover);\n}\n\n.nav-section-header span {\n font-size: var(--font-size-lg);\n margin-right: var(--spacing-sm);\n}\n\n.nav-section-header h3 {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n margin: 0;\n flex: 1;\n}\n\n.section-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n background: none;\n border: none;\n color: var(--text-tertiary);\n cursor: pointer;\n border-radius: var(--radius-sm);\n transition: all var(--transition-fast);\n}\n\n.section-toggle:hover {\n color: var(--text-secondary);\n background-color: var(--bg-tertiary);\n}\n\n.section-toggle .chevron {\n transition: transform var(--transition-fast);\n}\n\n.section-toggle.collapsed .chevron {\n transform: rotate(-90deg);\n}\n\n/* Main navigation sections */\n.nav-section .nav-list {\n transition: max-height var(--transition-normal), opacity var(--transition-fast);\n overflow: hidden;\n max-height: 1000px;\n opacity: 1;\n}\n\n.nav-section .nav-list.collapsed {\n max-height: 0;\n opacity: 0;\n margin: 0;\n padding: 0;\n}\n\n.nav-list {\n list-style: none;\n margin: 0;\n padding: 0 0 0 var(--spacing-lg);\n}\n\n.nav-list.collapsed {\n display: none;\n}\n\n.nav-item {\n margin: 0;\n}\n\n.nav-link {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-xl);\n color: var(--text-secondary);\n text-decoration: none;\n font-size: var(--font-size-sm);\n border-left: 2px solid transparent;\n transition: all var(--transition-fast);\n overflow: hidden;\n min-width: 0;\n}\n\n.nav-link:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n text-decoration: none;\n}\n\n.nav-link.active {\n color: var(--accent-primary);\n background-color: var(--bg-active);\n border-left-color: var(--accent-primary);\n}\n\n/* Nav Group Items - Tree Structure */\n.nav-group {\n margin-bottom: var(--spacing-xs);\n margin-left: var(--spacing-md);\n position: relative;\n}\n\n\n.nav-group-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-sm) var(--spacing-md);\n cursor: pointer;\n transition: background-color var(--transition-fast);\n border-radius: var(--radius-sm);\n margin: 0 var(--spacing-xs);\n}\n\n.nav-group-header:hover {\n background-color: var(--bg-hover);\n}\n\n.nav-group-header.expanded {\n background-color: var(--bg-active);\n}\n\n.nav-group-title {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n text-transform: capitalize;\n flex: 1;\n}\n\n.nav-group-count {\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n min-width: 1.5rem;\n text-align: center;\n margin-right: var(--spacing-sm);\n}\n\n.nav-group-chevron {\n color: var(--text-tertiary);\n transition: transform var(--transition-fast);\n}\n\n.nav-group-header.expanded .nav-group-chevron {\n transform: rotate(90deg);\n}\n\n.nav-sublist {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease-in-out, overflow 0.3s ease-in-out;\n margin-left: var(--spacing-lg);\n position: relative;\n list-style: none;\n padding: 0;\n}\n\n\n.nav-subitem {\n position: relative;\n}\n\n\n.nav-subitem .nav-link {\n padding: var(--spacing-xs) var(--spacing-md);\n font-size: var(--font-size-xs);\n margin: var(--spacing-xs) 0;\n}\n\n/* Method Badges */\n.method-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: var(--radius-sm);\n color: white;\n flex-shrink: 0;\n}\n\n.method-badge.small {\n padding: 0.125rem 0.375rem;\n min-width: 2.5rem;\n}\n\n.method-badge.large {\n padding: 0.25rem 0.5rem;\n min-width: 3rem;\n}\n\n.method-badge.method-get {\n background-color: var(--method-get);\n}\n\n.method-badge.method-post {\n background-color: var(--method-post);\n}\n\n.method-badge.method-put {\n background-color: var(--method-put);\n}\n\n.method-badge.method-delete {\n background-color: var(--method-delete);\n}\n\n.method-badge.method-patch {\n background-color: var(--method-patch);\n}\n\n.method-badge.method-head {\n background-color: var(--method-head);\n}\n\n.method-badge.method-options {\n background-color: var(--method-options);\n}\n\n/* Endpoint Path */\n.endpoint-path {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n}\n\n/* Schema Icons */\n.schema-icon {\n font-size: var(--font-size-sm);\n}\n\n.schema-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n}\n\n/* Schema tree structure */\n#schemas-nav .nav-item {\n margin-left: var(--spacing-md);\n position: relative;\n}\n\n\n\n#schemas-nav .nav-link {\n padding: var(--spacing-xs) var(--spacing-md);\n margin: var(--spacing-xs) 0;\n}\n\n/* Breadcrumb */\n.breadcrumb {\n margin-bottom: var(--spacing-2xl);\n padding: var(--spacing-md) 0;\n border-bottom: 1px solid var(--border-primary);\n}\n\n.breadcrumb-list {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.breadcrumb-item {\n display: flex;\n align-items: center;\n font-size: var(--font-size-sm);\n}\n\n.breadcrumb-item:not(:last-child)::after {\n content: '/';\n color: var(--text-tertiary);\n margin-left: var(--spacing-sm);\n}\n\n.breadcrumb-item a {\n color: var(--text-link);\n text-decoration: none;\n}\n\n.breadcrumb-item a:hover {\n color: var(--text-link-hover);\n text-decoration: underline;\n}\n\n.breadcrumb-item.active span {\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n\n/* Content Sections */\n.content-section {\n margin-bottom: 0;\n}\n\n.section-header {\n margin-bottom: var(--spacing-2xl);\n padding-bottom: var(--spacing-lg);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.section-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n margin-top: var(--spacing-md);\n}\n\n.version-badge {\n display: inline-flex;\n align-items: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-sm);\n}\n\n.github-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n color: var(--text-link);\n text-decoration: none;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n transition: color var(--transition-fast);\n}\n\n.github-link:hover {\n color: var(--text-link-hover);\n text-decoration: none;\n}\n\n/* Endpoint Sections */\n.endpoint-section .section-header {\n position: relative;\n}\n\n.endpoint-title {\n display: flex;\n align-items: center;\n gap: var(--spacing-lg);\n flex-wrap: wrap;\n}\n\n.endpoint-title h2 {\n font-family: var(--font-family-mono);\n font-weight: var(--font-weight-medium);\n margin: 0;\n word-break: break-all;\n}\n\n.endpoint-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.tag {\n display: inline-flex;\n align-items: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n color: var(--text-secondary);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-sm);\n text-transform: capitalize;\n}\n\n.endpoint-summary {\n font-size: var(--font-size-lg);\n color: var(--text-primary);\n margin-bottom: var(--spacing-xl);\n}\n\n.endpoint-description {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-xl);\n}\n\n/* Parameters */\n.parameters-section {\n margin-bottom: var(--spacing-4xl);\n}\n\n.parameters-section h3 {\n margin-bottom: var(--spacing-xl);\n}\n\n.parameter-group {\n margin-bottom: var(--spacing-md);\n margin-top: var(--spacing-md);\n}\n\n.parameter-group-title {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n margin-bottom: var(--spacing-lg);\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n}\n\n.parameter-group-title::before {\n content: '';\n width: 4px;\n height: 4px;\n background-color: var(--accent-primary);\n border-radius: 50%;\n}\n\n.parameter-table {\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.parameter-row {\n padding: var(--spacing-lg);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.parameter-row:last-child {\n border-bottom: none;\n}\n\n.parameter-info {\n width: 100%;\n}\n\n.parameter-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n margin-bottom: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.parameter-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.required-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem 0.375rem;\n background-color: var(--accent-danger);\n color: white;\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: var(--radius-sm);\n}\n\n.optional-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem 0.375rem;\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: var(--radius-sm);\n}\n\n.parameter-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-link);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n display: inline-block;\n margin-bottom: var(--spacing-sm);\n}\n\n.parameter-description {\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n/* Request Body */\n.request-body-section {\n margin-bottom: var(--spacing-4xl);\n}\n\n.request-body-description {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-lg);\n}\n\n/* Responses */\n.responses-section {\n margin-bottom: var(--spacing-4xl);\n}\n\n.responses-list {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xl);\n}\n\n.response-item {\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.response-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n padding: var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.status-code {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 3rem;\n padding: 0.25rem 0.5rem;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: white;\n border-radius: var(--radius-sm);\n}\n\n.status-code.status-success {\n background-color: var(--status-success);\n}\n\n.status-code.status-redirect {\n background-color: var(--status-redirect);\n}\n\n.status-code.status-client-error {\n background-color: var(--status-client-error);\n}\n\n.status-code.status-server-error {\n background-color: var(--status-server-error);\n}\n\n.response-description {\n flex: 1;\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n}\n\n/* Content Sections */\n.content-section {\n padding: var(--spacing-lg) var(--spacing-lg) var(--spacing-sm) var(--spacing-lg);\n}\n\n.media-type-section {\n margin-bottom: 0;\n}\n\n.media-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n margin-bottom: var(--spacing-lg);\n}\n\n/* Schema Components */\n.schema-section .section-header {\n margin-bottom: var(--spacing-2xl);\n}\n\n.schema-title {\n font-family: var(--font-family-mono);\n margin: 0;\n}\n\n.schema-type-badge {\n display: inline-flex;\n align-items: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n color: var(--text-secondary);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-sm);\n text-transform: lowercase;\n}\n\n.schema-summary {\n font-size: var(--font-size-lg);\n color: var(--text-primary);\n margin-bottom: var(--spacing-xl);\n}\n\n.schema-definition {\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n padding: var(--spacing-xl);\n}\n\n.schema-object,\n.schema-array,\n.schema-simple {\n margin-bottom: var(--spacing-lg);\n}\n\n.schema-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-link);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n display: inline-block;\n margin-bottom: var(--spacing-sm);\n}\n\n.schema-properties {\n margin-left: var(--spacing-lg);\n border-left: 2px solid var(--border-primary);\n padding-left: var(--spacing-lg);\n}\n\n.schema-property {\n margin-bottom: var(--spacing-lg);\n padding-bottom: var(--spacing-lg);\n border-bottom: 1px solid var(--border-secondary);\n}\n\n.schema-property:last-child {\n border-bottom: none;\n margin-bottom: 0;\n padding-bottom: 0;\n}\n\n.property-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.property-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.property-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-link);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n}\n\n.property-description {\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-left: var(--spacing-lg);\n}\n\n.schema-ref {\n margin: var(--spacing-sm) 0;\n}\n\n.schema-ref-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n color: var(--text-link);\n text-decoration: none;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n transition: all var(--transition-fast);\n}\n\n.schema-ref-link:hover {\n color: var(--text-link-hover);\n background-color: var(--bg-hover);\n text-decoration: none;\n}\n\n.schema-description {\n margin-left: var(--spacing-sm);\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n}\n\n/* Example Sections */\n.example-section,\n.example-request-section {\n margin-bottom: var(--spacing-4xl);\n}\n\n.code-block {\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.code-header,\n.example-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: var(--bg-secondary);\n border-bottom: 1px solid var(--border-primary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-secondary);\n}\n\n.copy-button {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.copy-button:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n}\n\n.copy-button.copied {\n color: var(--accent-success);\n border-color: var(--accent-success);\n}\n\n/* Overview Components */\n.lead {\n font-size: var(--font-size-xl);\n color: var(--text-primary);\n margin-bottom: var(--spacing-4xl);\n line-height: var(--line-height-relaxed);\n}\n\n.features-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: var(--spacing-2xl);\n margin-bottom: var(--spacing-4xl);\n}\n\n.feature-card {\n padding: var(--spacing-2xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n transition: all var(--transition-normal);\n}\n\n.feature-card:hover {\n border-color: var(--border-secondary);\n transform: translateY(-2px);\n box-shadow: var(--shadow-lg);\n}\n\n.feature-icon {\n font-size: 2rem;\n margin-bottom: var(--spacing-lg);\n display: block;\n}\n\n.feature-card h3 {\n margin-bottom: var(--spacing-md);\n color: var(--text-primary);\n}\n\n.feature-card p {\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n}\n\n.quick-start {\n margin-top: var(--spacing-4xl);\n}\n\n.quick-start h3 {\n margin-bottom: var(--spacing-xl);\n color: var(--text-primary);\n}\n\n.notice-box {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-md);\n padding: var(--spacing-lg);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-left: 4px solid var(--accent-primary);\n border-radius: var(--radius-md);\n margin-top: var(--spacing-xl);\n}\n\n.notice-icon {\n font-size: var(--font-size-lg);\n flex-shrink: 0;\n}\n\n.notice-content {\n flex: 1;\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n.notice-content strong {\n color: var(--text-primary);\n}\n\n/* Search Results */\n.search-results {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-top: none;\n border-radius: 0 0 var(--radius-lg) var(--radius-lg);\n box-shadow: var(--shadow-xl);\n z-index: 1000;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.search-results-content {\n padding: var(--spacing-lg);\n}\n\n.search-section {\n margin-bottom: var(--spacing-xl);\n}\n\n.search-section:last-child {\n margin-bottom: 0;\n}\n\n.search-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-md);\n}\n\n.search-section-header h4 {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: 0;\n}\n\n.search-count {\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n min-width: 1.5rem;\n text-align: center;\n}\n\n.search-items {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n}\n\n.search-item {\n display: block;\n padding: var(--spacing-md);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n cursor: pointer;\n transition: all var(--transition-fast);\n text-decoration: none;\n color: inherit;\n}\n\n.search-item:hover {\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n text-decoration: none;\n color: inherit;\n}\n\n.search-item-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-xs);\n}\n\n.search-item-path,\n.search-item-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.search-item-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-link);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n}\n\n.search-item-summary {\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n line-height: var(--line-height-normal);\n margin-bottom: var(--spacing-xs);\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search-item-tags {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n flex-wrap: wrap;\n}\n\n.search-tag {\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n text-transform: capitalize;\n}\n\n.search-item-more {\n padding: var(--spacing-sm);\n text-align: center;\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n font-style: italic;\n}\n\n.search-no-results {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-4xl) var(--spacing-2xl);\n text-align: center;\n}\n\n.no-results-icon {\n font-size: 3rem;\n margin-bottom: var(--spacing-lg);\n opacity: 0.5;\n}\n\n.no-results-text p {\n margin-bottom: var(--spacing-sm);\n color: var(--text-primary);\n}\n\n.no-results-text small {\n color: var(--text-tertiary);\n font-size: var(--font-size-sm);\n}\n\n/* API Explorer Components */\n.api-explorer {\n margin-top: var(--spacing-4xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n overflow: hidden;\n}\n\n.explorer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-lg) var(--spacing-xl);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.explorer-header h3 {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n}\n\n.try-button {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: var(--accent-primary);\n color: white;\n border: none;\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.try-button:hover {\n background-color: var(--text-link-hover);\n transform: translateY(-1px);\n}\n\n.try-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.explorer-content {\n padding: var(--spacing-xl);\n}\n\n.request-config {\n margin-bottom: var(--spacing-4xl);\n}\n\n.config-section {\n margin-bottom: var(--spacing-2xl);\n}\n\n.config-section h4 {\n color: var(--text-primary);\n margin-bottom: var(--spacing-lg);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n}\n\n.section-description {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-lg);\n font-size: var(--font-size-sm);\n}\n\n/* URL Builder */\n.url-builder {\n margin-bottom: var(--spacing-lg);\n}\n\n.url-display {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n padding: var(--spacing-sm);\n}\n\n.request-url {\n flex: 1;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background: none;\n border: none;\n outline: none;\n padding: var(--spacing-sm);\n}\n\n.copy-url-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.copy-url-button:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n}\n\n/* Parameter Forms */\n.parameters-form {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xl);\n}\n\n.parameter-group h5 {\n color: var(--text-primary);\n margin-bottom: var(--spacing-lg);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n}\n\n.parameter-input {\n margin-bottom: var(--spacing-lg);\n}\n\n.parameter-label {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.param-input {\n width: 100%;\n padding: var(--spacing-md);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n transition: border-color var(--transition-fast);\n}\n\n.param-input:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.1);\n}\n\n.param-input::placeholder {\n color: var(--text-tertiary);\n}\n\n/* Request Body Input */\n.request-body-input {\n position: relative;\n}\n\n.input-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-sm);\n}\n\n.input-header span {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n}\n\n.format-json-button {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.format-json-button:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n}\n\n.json-input {\n width: 100%;\n min-height: 200px;\n padding: var(--spacing-lg);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n resize: vertical;\n transition: border-color var(--transition-fast);\n}\n\n.json-input:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.1);\n}\n\n/* Headers Input */\n.headers-input {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n}\n\n.header-row,\n.custom-header-row {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n}\n\n.header-name,\n.header-value {\n flex: 1;\n padding: var(--spacing-sm) var(--spacing-md);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n transition: border-color var(--transition-fast);\n}\n\n.header-name:focus,\n.header-value:focus {\n outline: none;\n border-color: var(--border-focus);\n}\n\n.add-header-button,\n.remove-header-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n color: var(--text-tertiary);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.add-header-button:hover {\n color: var(--accent-success);\n border-color: var(--accent-success);\n}\n\n.remove-header-button:hover {\n color: var(--accent-danger);\n border-color: var(--accent-danger);\n}\n\n/* Request/Response Area */\n.request-response-area {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-2xl);\n}\n\n.request-preview {\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.section-header h4 {\n margin: 0;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.copy-request-button,\n.copy-response-button {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.copy-request-button:hover,\n.copy-response-button:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n}\n\n/* Response Area */\n.response-area {\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.response-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n}\n\n.response-time {\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n padding: 0.125rem 0.375rem;\n background-color: var(--bg-secondary);\n border-radius: var(--radius-sm);\n}\n\n.response-status {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-semibold);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n color: white;\n}\n\n/* Tab Navigation */\n.tab-navigation {\n display: flex;\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md) var(--radius-md) 0 0;\n margin-bottom: 0;\n}\n\n.tab-navigation .tab-button {\n flex: 1;\n padding: var(--spacing-lg) var(--spacing-xl);\n background: none;\n border: none;\n color: var(--text-secondary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n border-bottom: 3px solid transparent;\n position: relative;\n}\n\n.tab-navigation .tab-button:first-child {\n border-radius: var(--radius-md) 0 0 0;\n}\n\n.tab-navigation .tab-button:last-child {\n border-radius: 0 var(--radius-md) 0 0;\n}\n\n.tab-navigation .tab-button:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n}\n\n.tab-navigation .tab-button.active {\n color: var(--accent-primary);\n border-bottom-color: var(--accent-primary);\n background-color: var(--bg-primary);\n}\n\n.tab-content {\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-top: none;\n border-radius: 0 0 var(--radius-md) var(--radius-md);\n overflow: hidden;\n}\n\n.tab-pane {\n display: none;\n padding: var(--spacing-2xl);\n animation: fadeIn 0.2s ease-in-out;\n}\n\n.tab-pane.active {\n display: block;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Getting Started Styles */\n.getting-started-content {\n max-width: 900px;\n}\n\n.setup-steps {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3xl);\n margin-bottom: var(--spacing-4xl);\n}\n\n.setup-step {\n display: flex;\n gap: var(--spacing-xl);\n align-items: flex-start;\n}\n\n.step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background-color: var(--accent-primary);\n color: white;\n font-weight: var(--font-weight-bold);\n font-size: var(--font-size-lg);\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: var(--spacing-sm);\n}\n\n.step-content {\n flex: 1;\n}\n\n.step-content h4 {\n margin-bottom: var(--spacing-lg);\n color: var(--text-primary);\n font-size: var(--font-size-lg);\n}\n\n.step-content p {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-lg);\n font-size: var(--font-size-sm);\n}\n\n.configuration-section {\n margin-top: var(--spacing-4xl);\n}\n\n.configuration-section h3 {\n margin-bottom: var(--spacing-xl);\n color: var(--text-primary);\n}\n\n.configuration-section p {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-xl);\n}\n\n.config-table {\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.config-row {\n display: flex;\n align-items: center;\n padding: var(--spacing-lg);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.config-row:last-child {\n border-bottom: none;\n}\n\n.config-key {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n min-width: 200px;\n padding-right: var(--spacing-lg);\n}\n\n.config-desc {\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-relaxed);\n flex: 1;\n}\n\n/* Enhanced Features Styles */\n.features-content {\n max-width: 1200px;\n}\n\n.features-content .features-grid {\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: var(--spacing-3xl);\n margin-bottom: var(--spacing-5xl);\n}\n\n.feature-card.detailed {\n padding: var(--spacing-3xl);\n min-height: 280px;\n}\n\n.feature-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-lg);\n margin-bottom: var(--spacing-lg);\n}\n\n.feature-header .feature-icon {\n font-size: 2.5rem;\n margin-bottom: 0;\n}\n\n.feature-header h3 {\n margin: 0;\n font-size: var(--font-size-xl);\n}\n\n.feature-card.detailed p {\n font-size: var(--font-size-base);\n margin-bottom: var(--spacing-lg);\n line-height: var(--line-height-relaxed);\n}\n\n.feature-list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.feature-list li {\n position: relative;\n padding-left: var(--spacing-xl);\n margin-bottom: var(--spacing-md);\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-relaxed);\n}\n\n.feature-list li::before {\n content: '•';\n position: absolute;\n left: 0;\n color: var(--accent-primary);\n font-weight: var(--font-weight-bold);\n}\n\n.technical-features {\n margin-top: var(--spacing-4xl);\n}\n\n.technical-features h3 {\n margin-bottom: var(--spacing-3xl);\n color: var(--text-primary);\n text-align: center;\n}\n\n.tech-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: var(--spacing-2xl);\n}\n\n.tech-item {\n text-align: center;\n padding: var(--spacing-2xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n transition: all var(--transition-normal);\n}\n\n.tech-item:hover {\n border-color: var(--border-secondary);\n transform: translateY(-4px);\n box-shadow: var(--shadow-md);\n}\n\n.tech-item h4 {\n margin-bottom: var(--spacing-lg);\n color: var(--text-primary);\n font-size: var(--font-size-lg);\n}\n\n.tech-item p {\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-relaxed);\n margin: 0;\n}\n\n/* Response Tabs */\n.response-tabs {\n display: flex;\n background-color: var(--bg-secondary);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.response-tabs .tab-button {\n flex: 1;\n padding: var(--spacing-md) var(--spacing-lg);\n background: none;\n border: none;\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n border-bottom: 2px solid transparent;\n}\n\n.response-tabs .tab-button:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n}\n\n.response-tabs .tab-button.active {\n color: var(--accent-primary);\n border-bottom-color: var(--accent-primary);\n background-color: var(--bg-primary);\n}\n\n.response-content {\n position: relative;\n}\n\n.tab-content {\n display: none;\n padding: var(--spacing-lg);\n}\n\n.tab-content.active {\n display: block;\n}\n\n/* Headers List */\n.headers-list {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n}\n\n.header-item {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) 0;\n border-bottom: 1px solid var(--border-secondary);\n}\n\n.header-item:last-child {\n border-bottom: none;\n}\n\n.header-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n min-width: 120px;\n}\n\n.header-value {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n word-break: break-all;\n flex: 1;\n}\n\n/* Loading State */\n.loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-4xl);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n}\n\n.loading-spinner {\n display: flex;\n align-items: center;\n gap: var(--spacing-lg);\n color: var(--text-secondary);\n}\n\n.spinner.small {\n width: 24px;\n height: 24px;\n border-width: 2px;\n}\n\n/* Error State */\n.error-state {\n background-color: var(--bg-primary);\n border: 1px solid var(--accent-danger);\n border-radius: var(--radius-md);\n padding: var(--spacing-xl);\n}\n\n.error-content {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-lg);\n}\n\n.error-icon {\n font-size: 2rem;\n flex-shrink: 0;\n}\n\n.error-message {\n flex: 1;\n}\n\n.error-message h5 {\n color: var(--accent-danger);\n margin-bottom: var(--spacing-sm);\n font-size: var(--font-size-base);\n}\n\n.error-message p {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-lg);\n}\n\n.error-details {\n margin-top: var(--spacing-md);\n}\n\n.error-details summary {\n color: var(--text-tertiary);\n cursor: pointer;\n font-size: var(--font-size-sm);\n margin-bottom: var(--spacing-sm);\n}\n\n.error-details pre {\n background-color: var(--bg-secondary);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n max-height: 200px;\n overflow-y: auto;\n}\n\n/* Interactive Parameter Input Forms */\n.example-request-section {\n margin-top: var(--spacing-4xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n overflow: hidden;\n}\n\n.example-request-section h3 {\n margin: 0;\n padding: var(--spacing-lg) var(--spacing-xl);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n color: var(--text-primary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n}\n\n.parameter-form {\n padding: var(--spacing-2xl);\n margin: var(--spacing-lg);\n}\n\n.parameter-section {\n margin-bottom: var(--spacing-xl);\n margin-top: var(--spacing-xl);\n}\n\n.parameter-section:last-child {\n margin-bottom: 0;\n}\n\n.parameter-section h4 {\n margin: 0 0 var(--spacing-lg) var(--spacing-sm);\n color: var(--text-primary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n}\n\n.parameter-section h4::before {\n content: '';\n width: 4px;\n height: 4px;\n background-color: var(--accent-primary);\n border-radius: 50%;\n}\n\n.parameter-inputs {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-md);\n margin-left: var(--spacing-sm);\n margin-right: var(--spacing-sm);\n}\n\n.param-input-group {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-sm);\n}\n\n.param-label {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n flex-wrap: wrap;\n margin-left: var(--spacing-xs);\n}\n\n.param-input {\n padding: var(--spacing-sm) var(--spacing-md);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n transition: all var(--transition-fast);\n width: calc(100% - var(--spacing-md));\n box-sizing: border-box;\n margin: 0 var(--spacing-xs);\n}\n\n.param-input:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.1);\n}\n\n.param-input::placeholder {\n color: var(--text-tertiary);\n font-style: italic;\n}\n\n.param-input.error {\n border-color: var(--accent-danger);\n box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.1);\n}\n\n.param-input.error:focus {\n border-color: var(--accent-danger);\n box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.2);\n}\n\n.param-description {\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-top: var(--spacing-xs);\n margin-left: var(--spacing-md);\n}\n\n.parameter-error {\n display: none;\n font-size: var(--font-size-xs);\n color: var(--accent-danger);\n margin-top: var(--spacing-xs);\n margin-left: var(--spacing-md);\n}\n\n.parameter-error.show {\n display: block;\n}\n\n.generate-curl-section {\n margin: var(--spacing-2xl) var(--spacing-lg) var(--spacing-lg) var(--spacing-lg);\n padding-top: var(--spacing-2xl);\n border-top: 1px solid var(--border-primary);\n}\n\n.generate-curl-btn {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: var(--accent-primary);\n color: white;\n border: none;\n border-radius: var(--radius-sm);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n margin: 0 var(--spacing-sm) var(--spacing-lg) var(--spacing-sm);\n}\n\n.generate-curl-btn:hover {\n background-color: var(--text-link-hover);\n transform: translateY(-1px);\n}\n\n.generate-curl-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.send-request-btn {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: #2ea043;\n color: white;\n border: none;\n border-radius: var(--radius-sm);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n margin: 0 var(--spacing-sm) var(--spacing-lg) var(--spacing-sm);\n}\n\n.send-request-btn:hover {\n background-color: #3fb950;\n transform: translateY(-1px);\n}\n\n.send-request-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.generate-curl-section {\n display: flex;\n gap: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.response-section {\n margin: var(--spacing-md) var(--spacing-sm) 0 var(--spacing-sm);\n}\n\n.response-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n margin-bottom: var(--spacing-sm);\n}\n\n.response-header h4 {\n margin: 0;\n}\n\n.response-status {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n padding: 2px 8px;\n border-radius: var(--radius-sm);\n}\n\n.response-status.status-success {\n background-color: rgba(46, 160, 67, 0.2);\n color: #3fb950;\n}\n\n.response-status.status-error {\n background-color: rgba(248, 81, 73, 0.2);\n color: #f85149;\n}\n\n.response-time {\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n}\n\n.generated-curl-section {\n margin: var(--spacing-md) var(--spacing-sm) 0 var(--spacing-sm);\n}\n\n.generated-curl-container {\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n overflow: hidden;\n margin: var(--spacing-xs);\n}\n\n.generated-curl-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-sm) var(--spacing-md);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-secondary);\n}\n\n.generated-curl-code {\n padding: var(--spacing-md) var(--spacing-lg);\n}\n\n.generated-curl-code pre {\n margin: 0;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n line-height: var(--line-height-relaxed);\n white-space: pre-wrap;\n word-break: break-all;\n}\n\n.copy-generated-curl {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.copy-generated-curl:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n}\n\n.copy-generated-curl.copied {\n color: var(--accent-success);\n border-color: var(--accent-success);\n}\n\n/* Responsive design for parameter forms */\n@media (max-width: 768px) {\n .example-request-section h3 {\n padding: var(--spacing-md) var(--spacing-lg);\n font-size: var(--font-size-sm);\n }\n \n .parameter-form {\n padding: var(--spacing-lg);\n margin: var(--spacing-md);\n }\n \n .parameter-section {\n margin-bottom: var(--spacing-xl);\n }\n \n .parameter-section h4 {\n font-size: var(--font-size-xs);\n margin: var(--spacing-xs) 0 var(--spacing-md) var(--spacing-xs);\n }\n \n .parameter-inputs {\n margin-left: var(--spacing-xs);\n margin-right: var(--spacing-xs);\n }\n \n .param-label {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n font-size: var(--font-size-xs);\n margin-left: var(--spacing-xs);\n }\n \n .param-input {\n padding: var(--spacing-xs) var(--spacing-sm);\n font-size: var(--font-size-xs);\n width: calc(100% - var(--spacing-sm));\n margin: 0 var(--spacing-xs);\n }\n \n .generate-curl-section {\n margin: var(--spacing-xl) var(--spacing-md) var(--spacing-md) var(--spacing-md);\n padding-top: var(--spacing-xl);\n }\n \n .generate-curl-btn {\n width: calc(100% - var(--spacing-lg));\n justify-content: center;\n padding: var(--spacing-sm) var(--spacing-md);\n font-size: var(--font-size-xs);\n margin: 0 var(--spacing-xs) var(--spacing-md) var(--spacing-xs);\n }\n \n .generated-curl-section {\n margin: var(--spacing-sm) var(--spacing-xs) 0 var(--spacing-xs);\n }\n \n .generated-curl-container {\n margin: var(--spacing-xs);\n }\n \n .generated-curl-header {\n padding: var(--spacing-xs) var(--spacing-sm);\n font-size: var(--font-size-xs);\n }\n \n .generated-curl-code {\n padding: var(--spacing-sm) var(--spacing-md);\n }\n \n .generated-curl-code pre {\n font-size: var(--font-size-xs);\n }\n}\n\n/* Configuration Cards */\n.config-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: var(--spacing-lg);\n margin: var(--spacing-xl) 0;\n}\n\n.config-card {\n background: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n padding: var(--spacing-lg);\n transition: all 0.2s ease;\n}\n\n.config-card:hover {\n border-color: var(--accent-primary);\n background: var(--bg-tertiary);\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n}\n\n.config-card h4 {\n color: var(--text-primary);\n margin: 0 0 var(--spacing-sm) 0;\n font-size: var(--font-size-base);\n font-weight: 600;\n}\n\n.config-card p {\n color: var(--text-secondary);\n margin: 0;\n font-size: var(--font-size-sm);\n line-height: 1.5;\n}\n\n.config-example {\n margin: var(--spacing-lg) 0 var(--spacing-xl) 0;\n}\n\n.config-example h4 {\n color: var(--text-primary);\n margin: 0 0 var(--spacing-md) 0;\n font-size: var(--font-size-lg);\n font-weight: 600;\n}\n\n.config-guide-link {\n color: var(--accent-primary);\n text-decoration: none;\n font-weight: 500;\n transition: color 0.2s ease;\n}\n\n.config-guide-link:hover {\n color: var(--accent-primary);\n text-decoration: underline;\n}\n\n@media (max-width: 768px) {\n .config-cards {\n grid-template-columns: 1fr;\n gap: var(--spacing-md);\n }\n \n .config-card {\n padding: var(--spacing-md);\n }\n}\n\n/* Internal Link Styling */\n.internal-link {\n color: var(--accent-primary);\n text-decoration: none;\n font-weight: 500;\n transition: color 0.2s ease;\n border-bottom: 1px solid transparent;\n}\n\n.internal-link:hover {\n color: var(--accent-primary);\n text-decoration: none;\n border-bottom-color: var(--accent-primary);\n}\n\n/* Smooth scroll behavior for anchored elements */\nhtml {\n scroll-behavior: smooth;\n}\n\n/* Add some padding to headers when they're targeted by anchors */\nh1[id], h2[id], h3[id], h4[id] {\n scroll-margin-top: 80px; /* Account for fixed header */\n position: relative;\n}\n\n/* Highlight targeted sections briefly */\nh1[id]:target, h2[id]:target, h3[id]:target, h4[id]:target {\n animation: highlightTarget 2s ease-out;\n}\n\n@keyframes highlightTarget {\n 0% {\n background-color: rgba(88, 166, 255, 0.2);\n }\n 100% {\n background-color: transparent;\n }\n}\n\n/* Configuration Tables */\n.table-container {\n margin: var(--spacing-xl) 0;\n overflow-x: auto;\n border-radius: var(--radius-md);\n border: 1px solid var(--border-primary);\n background: var(--bg-secondary);\n}\n\n.config-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--font-size-sm);\n background: transparent;\n}\n\n.config-table thead {\n background: var(--bg-tertiary);\n border-bottom: 2px solid var(--border-primary);\n}\n\n.config-table thead th {\n padding: var(--spacing-md) var(--spacing-lg);\n text-align: left;\n font-weight: 600;\n color: var(--text-primary);\n border-right: 1px solid var(--border-primary);\n white-space: nowrap;\n}\n\n.config-table thead th:last-child {\n border-right: none;\n}\n\n.config-table tbody tr {\n border-bottom: 1px solid var(--border-secondary);\n transition: background-color 0.2s ease;\n}\n\n.config-table tbody tr:hover {\n background: rgba(88, 166, 255, 0.05);\n}\n\n.config-table tbody tr:last-child {\n border-bottom: none;\n}\n\n.config-table tbody td {\n padding: var(--spacing-md) var(--spacing-lg);\n color: var(--text-secondary);\n border-right: 1px solid var(--border-secondary);\n vertical-align: top;\n line-height: 1.5;\n}\n\n.config-table tbody td:last-child {\n border-right: none;\n}\n\n/* First column (Variable names) styling */\n.config-table tbody td:first-child {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-weight: 600;\n color: var(--accent-primary);\n background: rgba(88, 166, 255, 0.08);\n white-space: nowrap;\n}\n\n/* Second column (Required) styling */\n.config-table tbody td:nth-child(2) {\n text-align: center;\n font-weight: 600;\n white-space: nowrap;\n}\n\n/* Third column (Default) styling */\n.config-table tbody td:nth-child(3) {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n white-space: nowrap;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Special styling for checkmarks and cross marks */\n.config-table tbody td:nth-child(2):contains('✅') {\n color: #10b981;\n}\n\n.config-table tbody td:nth-child(2):contains('❌') {\n color: #ef4444;\n}\n\n/* Code elements in tables */\n.config-table code {\n background: rgba(88, 166, 255, 0.1);\n padding: 2px 6px;\n border-radius: var(--radius-sm);\n font-size: var(--font-size-xs);\n color: var(--accent-primary);\n}\n\n/* Responsive table behavior */\n@media (max-width: 768px) {\n .table-container {\n margin: var(--spacing-lg) -var(--spacing-md);\n border-left: none;\n border-right: none;\n border-radius: 0;\n }\n \n .config-table {\n font-size: var(--font-size-xs);\n }\n \n .config-table thead th,\n .config-table tbody td {\n padding: var(--spacing-sm) var(--spacing-md);\n }\n \n .config-table tbody td:nth-child(3) {\n max-width: 120px;\n }\n}\n\n@media (max-width: 480px) {\n .config-table thead th,\n .config-table tbody td {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .config-table thead th {\n font-size: var(--font-size-xs);\n }\n \n .config-table tbody td:nth-child(3) {\n max-width: 80px;\n }\n}\n\n/* Schema/Example Tabs Styling */\n.schema-example-tabs {\n margin-top: var(--spacing-lg);\n}\n\n.tab-headers {\n display: flex;\n border-bottom: 1px solid var(--border-primary);\n margin-bottom: 0;\n}\n\n.tab-header {\n background: none;\n border: none;\n padding: var(--spacing-md) var(--spacing-lg);\n color: var(--text-secondary);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n border-bottom: 2px solid transparent;\n transition: all var(--transition-fast);\n position: relative;\n}\n\n.tab-header:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n}\n\n.tab-header.active {\n color: var(--accent-primary);\n border-bottom-color: var(--accent-primary);\n background-color: var(--bg-tertiary);\n}\n\n.tab-contents {\n position: relative;\n min-height: 200px;\n}\n\n.tab-content {\n display: none;\n padding: var(--spacing-lg);\n animation: fadeIn 0.2s ease-in-out;\n}\n\n.tab-content.active {\n display: block;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; transform: translateY(5px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Generated Example Styling */\n.generated-example-section {\n background-color: var(--bg-secondary);\n border-radius: var(--radius-md);\n overflow: hidden;\n border: 1px solid var(--border-secondary);\n margin-bottom: 0;\n}\n\n.generated-example-section .example-header {\n background-color: var(--bg-tertiary);\n padding: var(--spacing-md) var(--spacing-lg);\n border-bottom: 1px solid var(--border-primary);\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n\n.generated-example-section .code-block {\n margin: 0;\n background-color: var(--bg-primary);\n}\n\n.generated-example-section .code-block pre {\n margin: 0;\n padding: var(--spacing-lg);\n background: transparent;\n border: none;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.example-note {\n padding: var(--spacing-sm) var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border-top: 1px solid var(--border-primary);\n color: var(--text-secondary);\n}\n\n.example-note small {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n font-size: var(--font-size-xs);\n}\n\n/* No Example/Error States */\n.no-example, .example-error {\n padding: var(--spacing-xl);\n text-align: center;\n color: var(--text-secondary);\n background-color: var(--bg-secondary);\n border: 1px dashed var(--border-primary);\n border-radius: var(--radius-md);\n}\n\n.example-error {\n color: var(--accent-warning);\n border-color: var(--accent-warning);\n background-color: rgba(210, 153, 34, 0.05);\n}\n\n.example-error span {\n display: block;\n font-weight: var(--font-weight-medium);\n margin-bottom: var(--spacing-xs);\n}\n\n/* Copy Button Enhancement */\n.copy-button {\n background: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n color: var(--text-secondary);\n padding: var(--spacing-xs);\n border-radius: var(--radius-sm);\n cursor: pointer;\n transition: all var(--transition-fast);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.copy-button:hover {\n background-color: var(--bg-hover);\n color: var(--text-primary);\n border-color: var(--accent-primary);\n}\n\n.copy-button:active {\n transform: scale(0.95);\n}\n\n/* Copy Success Feedback */\n.copy-button.copied {\n background-color: var(--accent-success);\n border-color: var(--accent-success);\n color: white;\n}\n\n.copy-button.copied::after {\n content: '✓';\n position: absolute;\n font-size: var(--font-size-xs);\n}\n\n.copy-button.copied svg {\n opacity: 0;\n}\n\n/* Data Schema Section Styling */\n.data-schema-section {\n margin-top: var(--spacing-md);\n margin-bottom: 0;\n padding: var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-secondary);\n border-radius: var(--radius-md);\n}\n\n.data-schema-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-md);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n font-size: var(--font-size-sm);\n}\n\n.schema-links {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-md);\n}\n\n.schema-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--bg-secondary);\n color: var(--text-link);\n text-decoration: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n font-size: var(--font-size-xs);\n font-family: var(--font-family-mono);\n transition: all var(--transition-fast);\n}\n\n.schema-link:hover {\n background-color: var(--bg-hover);\n border-color: var(--accent-primary);\n color: var(--text-link-hover);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.schema-link:active {\n transform: translateY(0);\n}\n\n.schema-link-icon {\n font-size: 0.75rem;\n opacity: 0.7;\n}\n\n.schema-link-name {\n font-weight: var(--font-weight-medium);\n}\n\n.schema-links-note {\n color: var(--text-secondary);\n font-size: var(--font-size-xs);\n font-style: italic;\n margin-bottom: 0;\n}\n\n.schema-links-note small {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n\n/* Responsive schema links */\n@media (max-width: 768px) {\n .schema-links {\n flex-direction: column;\n }\n \n .schema-link {\n justify-content: flex-start;\n padding: var(--spacing-sm);\n }\n}",""]);const s=i},142(e,n,t){t.d(n,{A:()=>s});var r=t(601),a=t.n(r),o=t(314),i=t.n(o)()(a());i.push([e.id,"/* Main CSS for Polkadot REST API Documentation - Dark Theme */\n\n/* CSS Custom Properties for Dark Theme */\n:root {\n /* Color Palette - GitHub Dark Inspired */\n --bg-primary: #0d1117;\n --bg-secondary: #161b22;\n --bg-tertiary: #21262d;\n --bg-overlay: rgba(13, 17, 23, 0.8);\n --bg-hover: #30363d;\n --bg-active: #282e33;\n \n /* Borders */\n --border-primary: #30363d;\n --border-secondary: #21262d;\n --border-focus: #58a6ff;\n \n /* Text Colors */\n --text-primary: #f0f6fc;\n --text-secondary: #8b949e;\n --text-tertiary: #6e7681;\n --text-link: #58a6ff;\n --text-link-hover: #79c0ff;\n --text-inverse: #24292f;\n \n /* Accent Colors */\n --accent-primary: #58a6ff;\n --accent-success: #3fb950;\n --accent-warning: #d29922;\n --accent-danger: #f85149;\n \n /* HTTP Method Colors */\n --method-get: #3fb950;\n --method-post: #d29922;\n --method-put: #58a6ff;\n --method-delete: #f85149;\n --method-patch: #a5a5a5;\n --method-head: #6f42c1;\n --method-options: #8b949e;\n \n /* Status Code Colors */\n --status-success: #3fb950;\n --status-redirect: #58a6ff;\n --status-client-error: #d29922;\n --status-server-error: #f85149;\n \n /* Shadows */\n --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n \n /* Typography */\n --font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n --font-family-mono: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;\n \n --font-size-xs: 0.75rem;\n --font-size-sm: 0.875rem;\n --font-size-base: 1rem;\n --font-size-lg: 1.125rem;\n --font-size-xl: 1.25rem;\n --font-size-2xl: 1.5rem;\n --font-size-3xl: 1.875rem;\n --font-size-4xl: 2.25rem;\n \n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n \n --line-height-tight: 1.25;\n --line-height-normal: 1.5;\n --line-height-relaxed: 1.625;\n \n /* Spacing */\n --spacing-xs: 0.25rem;\n --spacing-sm: 0.5rem;\n --spacing-md: 0.75rem;\n --spacing-lg: 1rem;\n --spacing-xl: 1.25rem;\n --spacing-2xl: 1.5rem;\n --spacing-3xl: 2rem;\n --spacing-4xl: 2.5rem;\n --spacing-5xl: 3rem;\n \n /* Border Radius */\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n \n /* Layout */\n --sidebar-width: 340px;\n --header-height: 64px;\n \n /* Transitions */\n --transition-fast: 150ms ease-in-out;\n --transition-normal: 200ms ease-in-out;\n --transition-slow: 300ms ease-in-out;\n}\n\n/* Light theme overrides (future feature) */\n[data-theme=\"light\"] {\n --bg-primary: #ffffff;\n --bg-secondary: #f6f8fa;\n --bg-tertiary: #ffffff;\n --bg-hover: #f3f4f6;\n --bg-active: #e5e7eb;\n \n --border-primary: #d0d7de;\n --border-secondary: #d8dee4;\n \n --text-primary: #24292f;\n --text-secondary: #656d76;\n --text-tertiary: #8b949e;\n --text-inverse: #f0f6fc;\n}\n\n/* Reset and Base Styles */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nhtml {\n font-size: 16px;\n scroll-behavior: smooth;\n}\n\nbody {\n font-family: var(--font-family-sans);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n line-height: var(--line-height-normal);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n overflow-x: hidden;\n}\n\n/* Typography */\nh1, h2, h3, h4, h5, h6 {\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-tight);\n margin-bottom: var(--spacing-md);\n color: var(--text-primary);\n}\n\nh1 { font-size: var(--font-size-3xl); }\nh2 { font-size: var(--font-size-2xl); }\nh3 { font-size: var(--font-size-xl); }\nh4 { font-size: var(--font-size-lg); }\nh5 { font-size: var(--font-size-base); }\nh6 { font-size: var(--font-size-sm); }\n\np {\n margin-bottom: var(--spacing-lg);\n color: var(--text-secondary);\n}\n\na {\n color: var(--text-link);\n text-decoration: none;\n transition: color var(--transition-fast);\n}\n\na:hover {\n color: var(--text-link-hover);\n text-decoration: underline;\n}\n\ncode {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n padding: 0.125rem 0.25rem;\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-primary);\n}\n\npre {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-relaxed);\n padding: var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow-x: auto;\n color: var(--text-primary);\n}\n\npre code {\n padding: 0;\n background: none;\n border: none;\n font-size: inherit;\n}\n\nstrong {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\nem {\n font-style: italic;\n color: var(--text-secondary);\n}\n\n/* Loading Screen */\n.loading-screen {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--bg-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n}\n\n.loading-spinner {\n text-align: center;\n}\n\n.spinner {\n width: 48px;\n height: 48px;\n border: 3px solid var(--border-primary);\n border-top: 3px solid var(--accent-primary);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto var(--spacing-lg);\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-spinner p {\n color: var(--text-secondary);\n margin: 0;\n}\n\n/* App Container */\n.app {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n}\n\n/* Header */\n.header {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: var(--header-height);\n background-color: var(--bg-secondary);\n border-bottom: 1px solid var(--border-primary);\n z-index: 1000;\n}\n\n.header-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n padding: 0 var(--spacing-lg);\n max-width: 100%;\n}\n\n.header-brand {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n min-width: 0;\n}\n\n.logo {\n flex-shrink: 0;\n}\n\n.brand-text {\n min-width: 0;\n}\n\n.brand-title {\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n margin: 0;\n color: var(--text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.brand-subtitle {\n font-size: var(--font-size-sm);\n color: var(--text-tertiary);\n white-space: nowrap;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n flex-shrink: 0;\n}\n\n/* Search */\n.search-container {\n position: relative;\n}\n\n.search-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-input {\n width: 300px;\n height: 40px;\n padding: 0 var(--spacing-lg) 0 40px;\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n color: var(--text-primary);\n font-size: var(--font-size-sm);\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n}\n\n.search-input:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.1);\n}\n\n.search-input::placeholder {\n color: var(--text-tertiary);\n}\n\n.search-icon {\n position: absolute;\n left: var(--spacing-md);\n color: var(--text-tertiary);\n pointer-events: none;\n z-index: 1;\n}\n\n.search-clear {\n position: absolute;\n right: var(--spacing-sm);\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n color: var(--text-tertiary);\n cursor: pointer;\n border-radius: var(--radius-sm);\n transition: all var(--transition-fast);\n}\n\n.search-clear:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n}\n\n/* Theme Toggle */\n.theme-toggle {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n color: var(--text-secondary);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.theme-toggle:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n}\n\n/* Mobile Menu Toggle */\n.menu-toggle {\n display: none;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 40px;\n height: 40px;\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.menu-toggle span {\n display: block;\n width: 18px;\n height: 2px;\n background-color: var(--text-secondary);\n margin: 2px 0;\n transition: all var(--transition-fast);\n}\n\n.menu-toggle:hover {\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n}\n\n.menu-toggle:hover span {\n background-color: var(--text-primary);\n}\n\n.menu-toggle.active span:nth-child(1) {\n transform: rotate(45deg) translate(5px, 5px);\n}\n\n.menu-toggle.active span:nth-child(2) {\n opacity: 0;\n}\n\n.menu-toggle.active span:nth-child(3) {\n transform: rotate(-45deg) translate(7px, -6px);\n}\n\n/* Main Layout */\n.main-layout {\n display: flex;\n margin-top: var(--header-height);\n min-height: calc(100vh - var(--header-height));\n}\n\n/* Sidebar */\n.sidebar {\n position: fixed;\n top: var(--header-height);\n left: 0;\n width: var(--sidebar-width);\n height: calc(100vh - var(--header-height));\n background-color: var(--bg-secondary);\n border-right: 1px solid var(--border-primary);\n overflow-y: auto;\n z-index: 999;\n transform: translateX(0);\n transition: transform var(--transition-normal);\n}\n\n.sidebar-content {\n padding: var(--spacing-xl) 0;\n}\n\n/* API Info */\n.api-info {\n padding: 0 var(--spacing-xl);\n margin-bottom: var(--spacing-2xl);\n}\n\n.api-version {\n display: inline-block;\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-sm);\n margin-bottom: var(--spacing-md);\n}\n\n.api-description {\n font-size: var(--font-size-sm);\n color: var(--text-tertiary);\n line-height: var(--line-height-relaxed);\n}\n\n/* Server Selector */\n.server-selector {\n padding: 0 var(--spacing-xl);\n margin-bottom: var(--spacing-2xl);\n}\n\n.server-label {\n display: block;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-secondary);\n margin-bottom: var(--spacing-sm);\n}\n\n.server-select {\n width: 100%;\n padding: var(--spacing-sm) var(--spacing-md);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n color: var(--text-primary);\n font-size: var(--font-size-sm);\n cursor: pointer;\n transition: border-color var(--transition-fast);\n}\n\n.server-select:focus {\n outline: none;\n border-color: var(--border-focus);\n}\n\n/* Main Content */\n.main-content {\n flex: 1;\n margin-left: var(--sidebar-width);\n padding: var(--spacing-2xl);\n overflow-y: auto;\n transition: margin-left var(--transition-normal);\n}\n\n/* Content Container */\n.content-container {\n max-width: 1024px;\n margin: 0 auto;\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .search-input {\n width: 250px;\n }\n}\n\n@media (max-width: 768px) {\n .header-content {\n padding: 0 var(--spacing-md);\n }\n \n .brand-subtitle {\n display: none;\n }\n \n .search-input {\n width: 200px;\n }\n \n .menu-toggle {\n display: flex;\n }\n \n .sidebar {\n transform: translateX(-100%);\n }\n \n .sidebar.mobile-open {\n transform: translateX(0);\n }\n \n .main-content {\n margin-left: 0;\n padding: var(--spacing-lg);\n }\n}\n\n@media (max-width: 640px) {\n .header-controls {\n gap: var(--spacing-sm);\n }\n \n .search-input {\n width: 180px;\n }\n \n .main-content {\n padding: var(--spacing-md);\n }\n}\n\n/* Utility Classes */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.flex {\n display: flex;\n}\n\n.items-center {\n align-items: center;\n}\n\n.justify-between {\n justify-content: space-between;\n}\n\n.gap-2 {\n gap: var(--spacing-sm);\n}\n\n.gap-4 {\n gap: var(--spacing-lg);\n}\n\n/* Focus Styles */\n*:focus {\n outline: none;\n}\n\n*:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}",""]);const s=i},91(e,n,t){t.d(n,{A:()=>s});var r=t(601),a=t.n(r),o=t(314),i=t.n(o)()(a());i.push([e.id,"/* Responsive design styles for Polkadot REST API Documentation */\n\n/* Large screens (1200px and up) */\n@media (min-width: 1200px) {\n .content-container {\n max-width: 1200px;\n }\n \n .search-input {\n width: 350px;\n }\n \n .features-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n/* Medium screens (768px to 1023px) */\n@media (max-width: 1023px) {\n :root {\n --sidebar-width: 260px;\n }\n \n .header-content {\n padding: 0 var(--spacing-lg);\n }\n \n .search-input {\n width: 240px;\n }\n \n .main-content {\n padding: var(--spacing-xl);\n }\n \n .endpoint-title {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-md);\n }\n \n .parameter-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .response-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-sm);\n }\n \n /* Header responsive for medium screens */\n .section-header h1 {\n font-size: var(--font-size-3xl);\n }\n}\n\n/* Tablet screens (768px to 1023px) */\n@media (max-width: 1023px) and (min-width: 768px) {\n .features-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n \n .search-item-header {\n flex-wrap: wrap;\n }\n \n .nav-group-header {\n padding: var(--spacing-sm) var(--spacing-lg);\n }\n \n .nav-link {\n padding: var(--spacing-sm) var(--spacing-lg);\n }\n}\n\n/* Small tablet and large mobile (640px to 767px) */\n@media (max-width: 767px) {\n .menu-toggle {\n display: flex;\n }\n \n .sidebar {\n transform: translateX(-100%);\n width: 100%;\n max-width: 320px;\n box-shadow: var(--shadow-xl);\n }\n \n .sidebar.mobile-open {\n transform: translateX(0);\n }\n \n .main-content {\n margin-left: 0;\n padding: var(--spacing-lg);\n }\n \n .header-content {\n padding: 0 var(--spacing-md);\n }\n \n .search-input {\n width: 200px;\n }\n \n .brand-subtitle {\n display: none;\n }\n \n .features-grid {\n grid-template-columns: 1fr;\n gap: var(--spacing-xl);\n }\n \n .feature-card {\n padding: var(--spacing-xl);\n }\n \n .section-header {\n margin-bottom: var(--spacing-xl);\n padding-bottom: var(--spacing-md);\n }\n \n .endpoint-title h2 {\n font-size: var(--font-size-xl);\n word-break: break-word;\n }\n \n .parameter-table {\n overflow-x: auto;\n }\n \n .parameter-row {\n padding: var(--spacing-md);\n }\n \n .code-block {\n font-size: var(--font-size-xs);\n }\n \n .search-results {\n position: fixed;\n top: var(--header-height);\n left: 0;\n right: 0;\n border-radius: 0;\n max-height: calc(100vh - var(--header-height));\n }\n \n .breadcrumb-list {\n flex-wrap: wrap;\n }\n \n .nav-subitem .nav-link {\n padding-left: var(--spacing-md);\n }\n}\n\n/* Mobile screens (480px to 639px) */\n@media (max-width: 639px) {\n .header-controls {\n gap: var(--spacing-sm);\n }\n \n .search-input {\n width: 160px;\n font-size: var(--font-size-sm);\n }\n \n .main-content {\n padding: var(--spacing-md);\n }\n \n .content-container {\n margin: 0;\n }\n \n .section-header {\n margin-bottom: var(--spacing-lg);\n }\n \n .endpoint-title {\n gap: var(--spacing-sm);\n }\n \n .method-badge.large {\n padding: 0.25rem 0.375rem;\n min-width: 2.5rem;\n font-size: var(--font-size-xs);\n }\n \n .endpoint-title h2 {\n font-size: var(--font-size-lg);\n }\n \n .parameters-section,\n .responses-section,\n .example-section,\n .example-request-section {\n margin-bottom: var(--spacing-2xl);\n }\n \n .parameter-row {\n padding: var(--spacing-sm);\n }\n \n .parameter-header {\n margin-bottom: var(--spacing-xs);\n }\n \n .response-item {\n margin-bottom: var(--spacing-md);\n }\n \n .response-header {\n padding: var(--spacing-md);\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .code-header,\n .example-header {\n padding: var(--spacing-sm) var(--spacing-md);\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .copy-button {\n padding: var(--spacing-xs);\n font-size: var(--font-size-xs);\n }\n \n .api-info {\n padding: 0 var(--spacing-md);\n }\n \n .server-selector {\n padding: 0 var(--spacing-md);\n }\n \n .nav-group-header {\n padding: var(--spacing-sm) var(--spacing-md);\n }\n \n .nav-link {\n padding: var(--spacing-sm) var(--spacing-md);\n font-size: var(--font-size-xs);\n }\n \n .nav-section-header {\n padding: 0 var(--spacing-md) var(--spacing-sm);\n }\n \n .search-item {\n padding: var(--spacing-sm);\n }\n \n .search-item-header {\n margin-bottom: var(--spacing-xs);\n }\n \n .search-item-tags {\n margin-top: var(--spacing-xs);\n }\n}\n\n/* Very small mobile screens (up to 479px) */\n@media (max-width: 479px) {\n .header-content {\n padding: 0 var(--spacing-sm);\n }\n \n .search-input {\n width: 140px;\n }\n \n .brand-title {\n font-size: var(--font-size-base);\n }\n \n .main-content {\n padding: var(--spacing-sm);\n }\n \n .endpoint-title h2 {\n font-size: var(--font-size-base);\n word-break: break-all;\n }\n \n .method-badge.large {\n padding: 0.125rem 0.25rem;\n min-width: 2rem;\n font-size: var(--font-size-xs);\n }\n \n .features-grid {\n gap: var(--spacing-lg);\n }\n \n .feature-card {\n padding: var(--spacing-lg);\n }\n \n .feature-icon {\n font-size: 1.5rem;\n margin-bottom: var(--spacing-md);\n }\n \n .sidebar {\n max-width: 280px;\n }\n \n .api-info {\n padding: 0 var(--spacing-sm);\n margin-bottom: var(--spacing-xl);\n }\n \n .server-selector {\n padding: 0 var(--spacing-sm);\n margin-bottom: var(--spacing-xl);\n }\n \n .nav-group-header {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .nav-link {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .nav-section-header {\n padding: 0 var(--spacing-sm) var(--spacing-sm);\n }\n \n .nav-subitem .nav-link {\n padding-left: var(--spacing-lg);\n }\n \n .parameter-row {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .code-header,\n .example-header {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .response-header {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .schema-definition {\n padding: var(--spacing-md);\n }\n \n .search-results-content {\n padding: var(--spacing-md);\n }\n \n .search-no-results {\n padding: var(--spacing-2xl) var(--spacing-lg);\n }\n \n .no-results-icon {\n font-size: 2rem;\n margin-bottom: var(--spacing-md);\n }\n}\n\n/* Landscape phone orientation */\n@media (max-height: 600px) and (orientation: landscape) {\n .loading-screen {\n padding: var(--spacing-lg);\n }\n \n .sidebar {\n height: calc(100vh - var(--header-height));\n overflow-y: auto;\n }\n \n .search-results {\n max-height: 200px;\n }\n \n .nav-group-header {\n padding: var(--spacing-xs) var(--spacing-lg);\n }\n \n .nav-link {\n padding: var(--spacing-xs) var(--spacing-lg);\n }\n \n .api-info {\n margin-bottom: var(--spacing-lg);\n }\n \n .server-selector {\n margin-bottom: var(--spacing-lg);\n }\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n :root {\n --bg-primary: #000000;\n --bg-secondary: #1a1a1a;\n --bg-tertiary: #2d2d2d;\n --text-primary: #ffffff;\n --text-secondary: #e0e0e0;\n --border-primary: #555555;\n --accent-primary: #66b3ff;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n \n .spinner {\n animation: none;\n }\n}\n\n/* Print styles */\n@media print {\n .header,\n .sidebar,\n .search-results,\n .copy-button,\n .theme-toggle,\n .menu-toggle {\n display: none !important;\n }\n \n .main-content {\n margin-left: 0 !important;\n padding: 0 !important;\n }\n \n .content-section {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n \n .endpoint-section {\n page-break-after: always;\n }\n \n body {\n background: white !important;\n color: black !important;\n }\n \n .code-block {\n border: 1px solid #000;\n background: #f5f5f5 !important;\n }\n}\n\n/* Focus management for keyboard navigation */\n@media (any-hover: none) {\n .nav-link:focus,\n .search-item:focus,\n .copy-button:focus {\n outline: 2px solid var(--accent-primary);\n outline-offset: 2px;\n }\n}\n\n/* Touch device optimizations */\n@media (any-hover: none) {\n .nav-link,\n .search-item,\n .copy-button,\n .theme-toggle {\n min-height: 44px;\n }\n \n .nav-group-header {\n min-height: 44px;\n }\n \n .section-toggle {\n min-width: 44px;\n min-height: 44px;\n }\n}\n\n/* Container queries for modern browsers */\n@supports (container-type: inline-size) {\n .search-container {\n container-type: inline-size;\n }\n \n @container (max-width: 300px) {\n .search-input {\n width: 100%;\n }\n }\n \n .parameter-table {\n container-type: inline-size;\n }\n \n @container (max-width: 500px) {\n .parameter-header {\n flex-direction: column;\n align-items: flex-start;\n }\n }\n}\n\n/* API Explorer Responsive Styles */\n@media (max-width: 1023px) {\n .explorer-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-md);\n }\n \n .try-button {\n width: 100%;\n justify-content: center;\n }\n \n .url-display {\n flex-wrap: wrap;\n }\n \n .request-url {\n min-width: 200px;\n }\n \n .response-tabs {\n flex-wrap: wrap;\n }\n \n .tab-button {\n flex: 1 1 auto;\n min-width: 120px;\n }\n}\n\n@media (max-width: 767px) {\n .explorer-content {\n padding: var(--spacing-lg);\n }\n \n .config-section {\n margin-bottom: var(--spacing-xl);\n }\n \n .parameter-label {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .header-row,\n .custom-header-row {\n flex-direction: column;\n align-items: stretch;\n }\n \n .add-header-button,\n .remove-header-button {\n align-self: flex-end;\n margin-top: var(--spacing-sm);\n }\n \n .section-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-sm);\n }\n \n .response-meta {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .tab-content {\n padding: var(--spacing-md);\n }\n \n .error-content {\n flex-direction: column;\n }\n \n .error-icon {\n align-self: flex-start;\n }\n}\n\n@media (max-width: 479px) {\n .explorer-content {\n padding: var(--spacing-md);\n }\n \n .url-display {\n flex-direction: column;\n }\n \n .request-url {\n min-width: auto;\n width: 100%;\n }\n \n .copy-url-button {\n align-self: flex-end;\n }\n \n .json-input {\n min-height: 150px;\n }\n \n .response-tabs {\n flex-direction: column;\n }\n \n .tab-button {\n flex: none;\n border-bottom: none;\n border-right: 2px solid transparent;\n }\n \n .tab-button.active {\n border-bottom: none;\n border-right-color: var(--accent-primary);\n }\n \n .loading-state {\n padding: var(--spacing-2xl);\n }\n \n .loading-spinner {\n flex-direction: column;\n text-align: center;\n gap: var(--spacing-md);\n }\n \n /* Responsive header */\n .section-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-lg);\n text-align: left;\n }\n \n .section-meta {\n align-self: stretch;\n justify-content: flex-end;\n }\n}",""]);const s=i},314(e){e.exports=function(e){var n=[];return n.toString=function(){return this.map(function(n){var t="",r=void 0!==n[5];return n[4]&&(t+="@supports (".concat(n[4],") {")),n[2]&&(t+="@media ".concat(n[2]," {")),r&&(t+="@layer".concat(n[5].length>0?" ".concat(n[5]):""," {")),t+=e(n),r&&(t+="}"),n[2]&&(t+="}"),n[4]&&(t+="}"),t}).join("")},n.i=function(e,t,r,a,o){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var s=0;s0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=o),t&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=t):d[2]=t),a&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=a):d[4]="".concat(a)),n.push(d))}},n}},601(e){e.exports=function(e){return e[1]}},72(e){var n=[];function t(e){for(var t=-1,r=0;r0?" ".concat(t.layer):""," {")),r+=t.css,a&&(r+="}"),t.media&&(r+="}"),t.supports&&(r+="}");var o=t.sourceMap;o&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),n.styleTagTransform(r,e,n.options)}(n,e,t)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)}}}},113(e){e.exports=function(e,n){if(n.styleSheet)n.styleSheet.cssText=e;else{for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(document.createTextNode(e))}}}},n={};function t(r){var a=n[r];if(void 0!==a)return a.exports;var o=n[r]={id:r,exports:{}};return e[r](o,o.exports,t),o.exports}t.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return t.d(n,{a:n}),n},t.d=(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},t.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),t.nc=void 0;var r=t(72),a=t.n(r),o=t(825),i=t.n(o),s=t(659),c=t.n(s),l=t(56),d=t.n(l),p=t(540),u=t.n(p),m=t(113),h=t.n(m),g=t(142),f={};f.styleTagTransform=h(),f.setAttributes=d(),f.insert=c().bind(null,"head"),f.domAPI=i(),f.insertStyleElement=u(),a()(g.A,f),g.A&&g.A.locals&&g.A.locals;var v=t(365),y={};y.styleTagTransform=h(),y.setAttributes=d(),y.insert=c().bind(null,"head"),y.domAPI=i(),y.insertStyleElement=u(),a()(v.A,y),v.A&&v.A.locals&&v.A.locals;var b=t(91),x={};x.styleTagTransform=h(),x.setAttributes=d(),x.insert=c().bind(null,"head"),x.domAPI=i(),x.insertStyleElement=u(),a()(b.A,x),b.A&&b.A.locals&&b.A.locals;const k=JSON.parse('{"openapi":"3.1.0","info":{"title":"Polkadot REST API","description":"High-performance Rust REST API for Substrate/Polkadot blockchain data. Drop-in replacement for substrate-api-sidecar.","contact":{"url":"https://github.com/paritytech/polkadot-rest-api"},"license":{"name":"GPL-3.0-or-later"},"version":"0.1.0"},"servers":[{"url":"http://localhost:8080/v1","description":"Localhost"}],"paths":{"/v1/accounts/compare":{"get":{"tags":["accounts"],"summary":"Compare account addresses","description":"Compares multiple SS58 addresses to determine if they have the same underlying public key.","operationId":"get_compare","parameters":[{"name":"addresses","in":"query","description":"Comma-separated list of SS58 addresses to compare (max 30)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Comparison result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCompareResponse"}}}},"400":{"description":"Invalid parameters"}}}},"/v1/accounts/{accountId}/asset-approvals":{"get":{"tags":["accounts"],"summary":"Account asset approvals","description":"Returns asset approval information for a given account, asset, and delegate.","operationId":"get_asset_approvals","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"assetId","in":"query","description":"The asset ID to query approval for","required":true,"schema":{"type":"string"}},{"name":"delegate","in":"query","description":"The delegate address with spending approval","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Asset approval information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetApprovalResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/asset-balances":{"get":{"tags":["accounts"],"summary":"Account asset balances","description":"Returns asset balances for a given account on Asset Hub chains.","operationId":"get_asset_balances","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"assets","in":"query","description":"Comma-separated list of asset IDs to query","required":false,"schema":{"type":"string"}},{"name":"showEmpty","in":"query","description":"When true, include assets with zero balance (default: false)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Account asset balances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetBalancesResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/balance-info":{"get":{"tags":["accounts"],"summary":"Account balance info","description":"Returns balance information for a given account including free, reserved, and locked balances.","operationId":"get_balance_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"token","in":"query","description":"Token symbol for chains with multiple tokens","required":false,"schema":{"type":"string"}},{"name":"denominated","in":"query","description":"When true, denominate balances using chain decimals","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Account balance information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceInfoResponse"}}}},"400":{"description":"Invalid account or block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/convert":{"get":{"tags":["accounts"],"summary":"Convert account format","description":"Converts an account address between different SS58 formats and key types.","operationId":"get_convert","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address or hex public key","required":true,"schema":{"type":"string"}},{"name":"scheme","in":"query","description":"Cryptographic scheme: ed25519, sr25519, or ecdsa (default: sr25519)","required":false,"schema":{"type":"string"}},{"name":"prefix","in":"query","description":"SS58 prefix number (default: 42)","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"publicKey","in":"query","description":"If true, treat input as a public key","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Converted account information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountConvertResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/foreign-asset-balances":{"get":{"tags":["accounts"],"summary":"Account foreign asset balances","description":"Returns foreign asset balances for a given account on Asset Hub chains. Foreign assets use XCM MultiLocation as their identifier.","operationId":"get_foreign_asset_balances","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"foreignAssets","in":"query","description":"List of multilocation JSON strings to filter by","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"showEmpty","in":"query","description":"When true, include assets with zero balance (default: false)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Foreign asset balances","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid account or parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/pool-asset-approvals":{"get":{"tags":["accounts"],"summary":"Account pool asset approvals","description":"Returns pool asset approval information for a given account, asset, and delegate.","operationId":"get_pool_asset_approvals","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"assetId","in":"query","description":"The pool asset ID to query approval for","required":true,"schema":{"type":"string"}},{"name":"delegate","in":"query","description":"The delegate address with spending approval","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Pool asset approval information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolAssetApprovalResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/pool-asset-balances":{"get":{"tags":["accounts"],"summary":"Account pool asset balances","description":"Returns pool asset balances for a given account.","operationId":"get_pool_asset_balances","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"assets","in":"query","description":"Comma-separated list of pool asset IDs to query","required":false,"schema":{"type":"string"}},{"name":"showEmpty","in":"query","description":"When true, include assets with zero balance (default: false)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pool asset balances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolAssetBalancesResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/proxy-info":{"get":{"tags":["accounts"],"summary":"Account proxy info","description":"Returns proxy information for a given account including delegated proxies and their types.","operationId":"get_proxy_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Proxy information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyInfoResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/staking-info":{"get":{"tags":["accounts"],"summary":"Account staking info","description":"Returns staking information for a given stash account including bonded amount, controller, and nominations.","operationId":"get_staking_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded stash account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"includeClaimedRewards","in":"query","description":"When true, include claimed rewards in the response","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StakingInfoResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/staking-payouts":{"get":{"tags":["accounts"],"summary":"Account staking payouts","description":"Returns staking payout history for a given account including era rewards and claimed status.","operationId":"get_staking_payouts","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded stash account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"depth","in":"query","description":"Number of eras to query (default: 1)","required":false,"schema":{"type":"string"}},{"name":"era","in":"query","description":"The era to query at (default: active_era - 1)","required":false,"schema":{"type":"string"}},{"name":"unclaimedOnly","in":"query","description":"Only show unclaimed rewards (default: true)","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking payout information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StakingPayoutsResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/validate":{"get":{"tags":["accounts"],"summary":"Validate account address","description":"Validates an SS58-encoded account address and returns details about its format.","operationId":"get_validate","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address to validate","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number (accepted for API consistency)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Validation result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountValidateResponse"}}}}}}},"/v1/accounts/{accountId}/vesting-info":{"get":{"tags":["accounts"],"summary":"Account vesting info","description":"Returns vesting information for a given account including vesting schedules and locked amounts.","operationId":"get_vesting_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"includeClaimable","in":"query","description":"When true, calculate vested amounts","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Vesting information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VestingInfoResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/ahm-info":{"get":{"tags":["ahm"],"summary":"Asset Hub Migration info","description":"Returns information about the Asset Hub migration, including start and end blocks for both relay chain and Asset Hub.","operationId":"ahm_info","responses":{"200":{"description":"AHM migration boundaries","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No migration data available"}}}},"/v1/blocks":{"get":{"tags":["blocks"],"summary":"Get blocks by range","description":"Returns a collection of blocks given a numeric range. Range is inclusive and limited to 500 blocks.","operationId":"get_blocks","parameters":[{"name":"range","in":"query","description":"Block range in format \'start-end\' (e.g. \'100-200\')","required":false,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include documentation for events","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include documentation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat range as Relay Chain blocks","required":false,"schema":{"type":"boolean"}},{"name":"useEvmFormat","in":"query","description":"Convert AccountId32 addresses to EVM format for revive pallet events","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Array of block information","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}},"400":{"description":"Invalid range parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/head":{"get":{"tags":["blocks"],"summary":"Get latest block","description":"Returns the latest finalized or canonical block with full extrinsic and event details.","operationId":"get_block_head","parameters":[{"name":"finalized","in":"query","description":"When true (default), returns finalized head. When false, returns canonical head.","required":false,"schema":{"type":"boolean"}},{"name":"eventDocs","in":"query","description":"Include documentation for events","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include documentation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Decode and include XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"useRcBlock","in":"query","description":"When true, use relay chain head to find corresponding Asset Hub blocks","required":false,"schema":{"type":"boolean"}},{"name":"useEvmFormat","in":"query","description":"Convert AccountId32 addresses to EVM format for revive pallet events","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Latest block information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/head/header":{"get":{"tags":["blocks"],"summary":"Get head block header","description":"Returns the header of the latest finalized or canonical block (lightweight, no extrinsics/events).","operationId":"get_blocks_head_header","parameters":[{"name":"finalized","in":"query","description":"When true (default), returns finalized head header. When false, returns canonical head header.","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat as Relay Chain block and return Asset Hub blocks","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Block header information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}":{"get":{"tags":["blocks"],"summary":"Get block by ID","description":"Returns block information for a given block identifier (hash or number), including extrinsics, events, and fees.","operationId":"get_block","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include documentation for events","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include documentation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"finalizedKey","in":"query","description":"When true (default), include finalized status in response","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Decode and include XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"useRcBlock","in":"query","description":"Treat blockId as Relay Chain block and return Asset Hub blocks","required":false,"schema":{"type":"boolean"}},{"name":"useEvmFormat","in":"query","description":"Convert AccountId32 addresses to EVM format for revive pallet events","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Block information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}/extrinsics-raw":{"get":{"tags":["blocks"],"summary":"Get raw extrinsics","description":"Returns raw block data with hex-encoded extrinsics for a given block identifier. The extrinsics are returned as raw hex strings without decoding.","operationId":"get_block_extrinsics_raw","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"When true, treat blockId as Relay Chain block and return Asset Hub blocks","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Raw block data with hex-encoded extrinsics","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}/extrinsics/{extrinsicIndex}":{"get":{"tags":["blocks"],"summary":"Get extrinsic by index","description":"Returns a specific extrinsic from a block by its index within the block.","operationId":"get_extrinsic","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"extrinsicIndex","in":"path","description":"Index of the extrinsic within the block","required":true,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include documentation for events","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include documentation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"When true, treat blockId as Relay Chain block and return Asset Hub extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"useEvmFormat","in":"query","description":"Convert AccountId32 addresses to EVM format for revive pallet events","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Extrinsic details","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier or extrinsic index"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}/header":{"get":{"tags":["blocks"],"summary":"Get block header by ID","description":"Returns the header of the specified block (lightweight, no extrinsics/events).","operationId":"get_block_header","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat blockId as Relay Chain block and return Asset Hub blocks","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Block header information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}/para-inclusions":{"get":{"tags":["blocks"],"summary":"Get parachain inclusions","description":"Returns parachain inclusion information for a given relay chain block. Extracts CandidateIncluded events from the ParaInclusion pallet.","operationId":"get_block_para_inclusions","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"paraId","in":"query","description":"Filter results by a specific parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Parachain inclusion information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/capabilities":{"get":{"tags":["capabilities"],"summary":"API capabilities","description":"Returns the chain name and list of available pallets in the runtime metadata.","operationId":"get_capabilities","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Chain capabilities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilitiesResponse"}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/info":{"get":{"tags":["coretime"],"summary":"Get coretime info","description":"Returns coretime chain status information including the last committed timeslice.","operationId":"coretime_info","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime info","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/leases":{"get":{"tags":["coretime"],"summary":"Get coretime leases","description":"Returns all leases registered on a coretime chain with task IDs and validity timeslices.","operationId":"coretime_leases","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime leases","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/overview":{"get":{"tags":["coretime"],"summary":"Get coretime overview","description":"Returns an overview of all cores with assignments, queue state, workload, workplan, and regions.","operationId":"coretime_overview","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime overview","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/regions":{"get":{"tags":["coretime"],"summary":"Get coretime regions","description":"Returns all regions on a coretime chain including begin/end timeslices, core, owner, and mask.","operationId":"coretime_regions","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime regions","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/renewals":{"get":{"tags":["coretime"],"summary":"Get coretime potential renewals","description":"Returns potential renewals on a coretime chain sorted by core index, including price, completion status, and task assignment.","operationId":"coretime_renewals","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime renewals","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/reservations":{"get":{"tags":["coretime"],"summary":"Get coretime reservations","description":"Returns all reservations on a coretime chain. Reserved cores are permanently allocated and not available for sale.","operationId":"coretime_reservations","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime reservations","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/health":{"get":{"tags":["health"],"summary":"Health check","description":"Returns the health status of the API server.","operationId":"get_health","responses":{"202":{"description":"API is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v1/node/network":{"get":{"tags":["node"],"summary":"Node network info","description":"Returns the node\'s network information including peer count, syncing status, and local peer ID.","operationId":"get_node_network","responses":{"200":{"description":"Node network information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/node/transaction-pool":{"get":{"tags":["node"],"summary":"Transaction pool","description":"Returns the node\'s transaction pool with optional fee information.","operationId":"get_node_transaction_pool","parameters":[{"name":"includeFee","in":"query","description":"Include fee details for each transaction","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Transaction pool entries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionPoolResponse"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/node/version":{"get":{"tags":["node"],"summary":"Node version","description":"Returns the node\'s version information including client version, implementation name, and chain name.","operationId":"get_node_version","responses":{"200":{"description":"Node version information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeVersionResponse"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/asset-conversion/liquidity-pools":{"get":{"tags":["pallets"],"summary":"Liquidity pools","description":"Returns all liquidity pools from the AssetConversion pallet.","operationId":"get_liquidity_pools","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Liquidity pools","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/asset-conversion/next-available-id":{"get":{"tags":["pallets"],"summary":"Next available pool ID","description":"Returns the next available pool asset ID from the AssetConversion pallet.","operationId":"get_next_available_id","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Next available ID","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/assets/{assetId}/asset-info":{"get":{"tags":["pallets"],"summary":"Asset info","description":"Returns details for a specific asset including supply, admin, and metadata.","operationId":"pallets_assets_asset_info","parameters":[{"name":"assetId","in":"path","description":"Asset ID","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Asset information","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Asset not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/foreign-assets":{"get":{"tags":["pallets"],"summary":"Foreign assets","description":"Returns all foreign assets with their details and metadata. Foreign assets use XCM MultiLocation as their identifier.","operationId":"pallets_foreign_assets","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Foreign assets list","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Not supported on this chain"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/nomination-pools/info":{"get":{"tags":["pallets"],"summary":"Nomination pools info","description":"Returns global nomination pools statistics and configuration.","operationId":"pallets_nomination_pools_info","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Nomination pools information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Not supported on this chain"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/nomination-pools/{poolId}":{"get":{"tags":["pallets"],"summary":"Nomination pool details","description":"Returns details for a specific nomination pool.","operationId":"pallets_nomination_pools_pool","parameters":[{"name":"poolId","in":"path","description":"Pool ID","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pool details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Pool not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/on-going-referenda":{"get":{"tags":["pallets"],"summary":"On-going referenda","description":"Returns all currently active referenda from the Referenda pallet.","operationId":"pallets_on_going_referenda","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Active referenda","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/pool-assets/{assetId}/asset-info":{"get":{"tags":["pallets"],"summary":"Pool asset info","description":"Returns details for a specific pool asset including supply, admin, and metadata.","operationId":"pallets_pool_assets_asset_info","parameters":[{"name":"assetId","in":"path","description":"Pool asset ID","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pool asset information","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Pool asset not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/staking/progress":{"get":{"tags":["pallets"],"summary":"Staking progress","description":"Returns staking progress including era, session info, and validator counts.","operationId":"pallets_staking_progress","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking progress information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/staking/validators":{"get":{"tags":["pallets"],"summary":"Staking validators","description":"Returns the list of active validators and their info.","operationId":"pallets_staking_validators","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Validator information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/consts":{"get":{"tags":["pallets"],"summary":"Pallet constants","description":"Returns all constants defined in a pallet.","operationId":"pallets_constants","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return constant names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet constants","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/consts/{constantItemId}":{"get":{"tags":["pallets"],"summary":"Pallet constant value","description":"Returns the value and metadata of a specific constant in a pallet.","operationId":"pallets_constant_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"constantItemId","in":"path","description":"Name of the constant","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Constant value","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"404":{"description":"Constant not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/dispatchables":{"get":{"tags":["pallets"],"summary":"Pallet dispatchables","description":"Returns the dispatchable calls defined in a pallet.","operationId":"get_pallets_dispatchables","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return dispatchable names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet dispatchables","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/dispatchables/{dispatchableId}":{"get":{"tags":["pallets"],"summary":"Pallet dispatchable details","description":"Returns a single dispatchable call defined in a pallet.","operationId":"get_pallet_dispatchable_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"dispatchableId","in":"path","description":"Name of the dispatchable","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Dispatchable details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Dispatchable not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/errors":{"get":{"tags":["pallets"],"summary":"Pallet errors","description":"Returns all errors defined in a pallet.","operationId":"get_pallet_errors","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return error names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet errors","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/errors/{errorItemId}":{"get":{"tags":["pallets"],"summary":"Pallet error details","description":"Returns metadata for a specific error in a pallet.","operationId":"get_pallet_error_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"errorItemId","in":"path","description":"Name of the error","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Error details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Error not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/events":{"get":{"tags":["pallets"],"summary":"Get pallet events","description":"Returns all events defined in a pallet.","operationId":"get_pallet_events","parameters":[{"name":"palletId","in":"path","description":"Pallet name or index","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return event names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet events","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"404":{"description":"Pallet not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/events/{eventItemId}":{"get":{"tags":["pallets"],"summary":"Get pallet event item","description":"Returns metadata for a specific event in a pallet.","operationId":"get_pallet_event_item","parameters":[{"name":"palletId","in":"path","description":"Pallet name or index","required":true,"schema":{"type":"string"}},{"name":"eventItemId","in":"path","description":"Event name","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include full event metadata","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Event item details","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"404":{"description":"Pallet or event not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/storage":{"get":{"tags":["pallets"],"summary":"Pallet storage items","description":"Returns the list of storage items for a given pallet.","operationId":"get_pallets_storage","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return storage item names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet storage items","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet or parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/storage/{storageItemId}":{"get":{"tags":["pallets"],"summary":"Pallet storage item value","description":"Returns the value of a specific storage item in a pallet.","operationId":"get_pallets_storage_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"storageItemId","in":"path","description":"Name of the storage item","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"keys[]","in":"query","description":"Storage key arguments","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"metadata","in":"query","description":"Include metadata for the storage item","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Storage item value","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"404":{"description":"Storage item not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/paras/{number}/inclusion":{"get":{"tags":["paras"],"summary":"Parachain inclusion data","description":"Returns inclusion information for a given parachain block, searching relay chain blocks for when the parachain block was included.","operationId":"get_paras_inclusion","parameters":[{"name":"number","in":"path","description":"Parachain block number","required":true,"schema":{"type":"string"}},{"name":"depth","in":"query","description":"Search depth for relay chain blocks (max 100, default 10, must be divisible by 5)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Parachain inclusion information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/accounts/{accountId}/balance-info":{"get":{"tags":["rc"],"summary":"RC get balance info","description":"Returns balance information for a given account on the relay chain.","operationId":"get_balance_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"token","in":"query","description":"Token symbol (defaults to native token)","required":false,"schema":{"type":"string"}},{"name":"denominated","in":"query","description":"Denominate balances using chain decimals","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Balance information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcBalanceInfoResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/accounts/{accountId}/proxy-info":{"get":{"tags":["rc"],"summary":"RC get proxy info","description":"Returns proxy information for a given account on the relay chain.","operationId":"get_proxy_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Proxy information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcProxyInfoResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/accounts/{accountId}/staking-info":{"get":{"tags":["rc"],"summary":"RC get staking info","description":"Returns staking information for a given stash account on the relay chain.","operationId":"get_staking_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded stash account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"includeClaimedRewards","in":"query","description":"When true, include claimed rewards in the response","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcStakingInfoResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/accounts/{accountId}/staking-payouts":{"get":{"tags":["rc"],"summary":"RC get staking payouts","description":"Returns staking payout information for a given account on the relay chain.","operationId":"get_staking_payouts","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"depth","in":"query","description":"Number of eras to query (default: 1)","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"era","in":"query","description":"The era to query at (default: active_era - 1)","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"unclaimedOnly","in":"query","description":"Only show unclaimed rewards (default: true)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking payouts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcStakingPayoutsResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/accounts/{accountId}/vesting-info":{"get":{"tags":["rc"],"summary":"RC get vesting info","description":"Returns vesting information for a given account on the relay chain.","operationId":"get_vesting_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Vesting information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcVestingInfoResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks":{"get":{"tags":["rc"],"summary":"RC get blocks by range","description":"Returns relay chain blocks within a specified range (max 500 blocks).","operationId":"get_rc_blocks","parameters":[{"name":"range","in":"query","description":"Block range (e.g., \'100-200\')","required":false,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include event documentation","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include extrinsic documentation","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Decode and include XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Relay chain blocks","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid range or missing parameter"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/head":{"get":{"tags":["rc"],"summary":"RC get head block","description":"Returns the latest block on the relay chain.","operationId":"get_rc_blocks_head","parameters":[{"name":"finalized","in":"query","description":"When true returns finalized head (default: true)","required":false,"schema":{"type":"boolean"}},{"name":"eventDocs","in":"query","description":"Include event documentation","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include extrinsic documentation","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Decode and include XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Relay chain head block","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/head/header":{"get":{"tags":["rc"],"summary":"RC get head block header","description":"Returns the header of the latest relay chain block.","operationId":"get_rc_blocks_head_header","parameters":[{"name":"finalized","in":"query","description":"When true returns finalized head (default: true)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain head block header","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}":{"get":{"tags":["rc"],"summary":"RC get block by ID","description":"Returns relay chain block information for a given block identifier.","operationId":"get_rc_block","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include event documentation","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include extrinsic documentation","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Include decoded XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Relay chain block information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}/extrinsics-raw":{"get":{"tags":["rc"],"summary":"RC get raw extrinsics","description":"Returns raw hex-encoded extrinsics for a relay chain block without decoding.","operationId":"get_rc_block_extrinsics_raw","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Raw extrinsics","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}/extrinsics/{extrinsicIndex}":{"get":{"tags":["rc"],"summary":"RC get extrinsic by index","description":"Returns a specific extrinsic from a relay chain block by its index.","operationId":"get_rc_extrinsic","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"extrinsicIndex","in":"path","description":"Index of the extrinsic in the block","required":true,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include event documentation","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include extrinsic documentation","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Extrinsic details","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block ID or extrinsic index"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}/header":{"get":{"tags":["rc"],"summary":"RC get block header","description":"Returns the header of a relay chain block by block hash or block number.","operationId":"get_rc_block_header","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain block header","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}/para-inclusions":{"get":{"tags":["rc"],"summary":"RC get parachain inclusions","description":"Returns parachain inclusion information for a given relay chain block.","operationId":"get_rc_block_para_inclusions","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"paraId","in":"query","description":"Filter by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Parachain inclusions","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/node/network":{"get":{"tags":["rc"],"summary":"RC get node network","description":"Returns the relay chain node\'s network information.","operationId":"get_rc_node_network","responses":{"200":{"description":"Relay chain node network info","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/node/transaction-pool":{"get":{"tags":["rc"],"summary":"RC get transaction pool","description":"Returns the relay chain\'s transaction pool with optional fee information.","operationId":"get_rc_node_transaction_pool","parameters":[{"name":"includeFee","in":"query","description":"Include fee information for each transaction (default: false)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain transaction pool","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionPoolResponse"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/node/version":{"get":{"tags":["rc"],"summary":"RC get node version","description":"Returns the relay chain node\'s version information.","operationId":"get_rc_node_version","responses":{"200":{"description":"Relay chain node version","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeVersionResponse"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/pallets/on-going-referenda":{"get":{"tags":["rc"],"summary":"RC on-going referenda","description":"Returns all currently active referenda from the relay chain\'s Referenda pallet.","operationId":"rc_pallets_on_going_referenda","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Active referenda from relay chain","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/staking/progress":{"get":{"tags":["rc"],"summary":"RC staking progress","description":"Returns staking progress from the relay chain.","operationId":"rc_pallets_staking_progress","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain staking progress","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/staking/validators":{"get":{"tags":["rc"],"summary":"RC staking validators","description":"Returns the list of active validators from the relay chain.","operationId":"rc_pallets_staking_validators","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain validator information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/consts":{"get":{"tags":["rc"],"summary":"RC pallet constants","description":"Returns all constants defined in a relay chain pallet.","operationId":"rc_pallets_constants","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return constant names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet constants","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/consts/{constantItemId}":{"get":{"tags":["rc"],"summary":"RC pallet constant value","description":"Returns the value and metadata of a specific constant from a relay chain pallet.","operationId":"rc_pallets_constant_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"constantItemId","in":"path","description":"Name of the constant","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain constant value","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Constant not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/dispatchables":{"get":{"tags":["rc"],"summary":"RC pallet dispatchables","description":"Returns the dispatchable calls defined in a relay chain pallet.","operationId":"rc_pallets_dispatchables","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return dispatchable names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet dispatchables","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/dispatchables/{dispatchableId}":{"get":{"tags":["rc"],"summary":"RC pallet dispatchable details","description":"Returns a single dispatchable call from a relay chain pallet.","operationId":"rc_pallet_dispatchable_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"dispatchableId","in":"path","description":"Name of the dispatchable","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain dispatchable details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Dispatchable not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/errors":{"get":{"tags":["rc"],"summary":"RC pallet errors","description":"Returns all errors defined in a relay chain pallet.","operationId":"rc_pallet_errors","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return error names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet errors","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/errors/{errorItemId}":{"get":{"tags":["rc"],"summary":"RC pallet error details","description":"Returns metadata for a specific error in a relay chain pallet.","operationId":"rc_pallet_error_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"errorItemId","in":"path","description":"Name of the error","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain error details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Error not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/events":{"get":{"tags":["rc"],"summary":"RC pallet events","description":"Returns all events defined in a relay chain pallet.","operationId":"rc_pallet_events","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return event names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet events","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/events/{eventItemId}":{"get":{"tags":["rc"],"summary":"RC pallet event details","description":"Returns metadata for a specific event in a relay chain pallet.","operationId":"rc_pallet_event_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"eventItemId","in":"path","description":"Event name","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include full event metadata","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain event details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Pallet or event not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/storage":{"get":{"tags":["rc"],"summary":"RC pallet storage items","description":"Returns the list of storage items for a relay chain pallet.","operationId":"rc_get_pallets_storage","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return storage item names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet storage items","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet or parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/storage/{storageItemId}":{"get":{"tags":["rc"],"summary":"RC pallet storage item value","description":"Returns the value of a specific storage item from a relay chain pallet.","operationId":"rc_get_pallets_storage_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"storageItemId","in":"path","description":"Name of the storage item","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"keys[]","in":"query","description":"Storage key arguments","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"metadata","in":"query","description":"Include metadata for the storage item","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain storage item value","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"404":{"description":"Storage item not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/runtime/code":{"get":{"tags":["rc"],"summary":"RC get runtime code","description":"Returns the Wasm code blob of the relay chain runtime at a given block.","operationId":"get_rc_runtime_code","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain runtime code","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/runtime/metadata":{"get":{"tags":["rc"],"summary":"RC get runtime metadata","description":"Returns the decoded runtime metadata of the relay chain in JSON format.","operationId":"get_rc_runtime_metadata","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain runtime metadata","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/runtime/metadata/versions":{"get":{"tags":["rc"],"summary":"RC get metadata versions","description":"Returns the available metadata versions on the relay chain at a given block.","operationId":"get_rc_runtime_metadata_versions","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Available metadata versions","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/runtime/metadata/{version}":{"get":{"tags":["rc"],"summary":"RC get metadata by version","description":"Returns the relay chain metadata at a specific version (e.g., v14, v15).","operationId":"get_rc_runtime_metadata_versioned","parameters":[{"name":"version","in":"path","description":"Metadata version in \'vX\' format (e.g., v14, v15)","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain metadata at specified version","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid version format"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/runtime/spec":{"get":{"tags":["rc"],"summary":"RC get runtime spec","description":"Returns the runtime spec of the relay chain at a given block.","operationId":"get_rc_runtime_spec","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain runtime spec","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/transaction":{"post":{"tags":["rc"],"summary":"Submit transaction (relay chain)","description":"Submit a signed extrinsic to the relay chain transaction pool. Only available on parachains.","operationId":"submit_rc","requestBody":{"description":"Signed extrinsic with \'tx\' field containing hex-encoded transaction","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Transaction hash","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/transaction/dry-run":{"post":{"tags":["rc"],"summary":"RC dry run transaction","description":"Dry run a transaction on the relay chain.","operationId":"dry_run_rc","requestBody":{"description":"Transaction with \'tx\', \'senderAddress\', and optional \'at\' fields","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Dry run result","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/fee-estimate":{"post":{"tags":["rc"],"summary":"RC fee estimate","description":"Estimate the fee for a relay chain transaction.","operationId":"fee_estimate_rc","requestBody":{"description":"Transaction with \'tx\' field","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Fee estimate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeEstimateResponse"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/material":{"get":{"tags":["rc"],"summary":"RC transaction material","description":"Returns relay chain network information for transaction construction.","operationId":"material_rc","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"noMeta","in":"query","description":"DEPRECATED: If true, metadata is not included","required":false,"schema":{"type":"boolean"}},{"name":"metadata","in":"query","description":"Metadata format: \'json\' or \'scale\'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain transaction material","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/material/{metadataVersion}":{"get":{"tags":["rc"],"summary":"RC transaction material versioned","description":"Returns relay chain transaction material with metadata at a specific version.","operationId":"material_versioned_rc","parameters":[{"name":"metadataVersion","in":"path","description":"Metadata version (e.g., \'v14\', \'v15\')","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"noMeta","in":"query","description":"DEPRECATED: If true, metadata is not included","required":false,"schema":{"type":"boolean"}},{"name":"metadata","in":"query","description":"Metadata format: \'json\' or \'scale\'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain transaction material with versioned metadata","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/metadata-blob":{"post":{"tags":["rc"],"summary":"RC metadata blob","description":"Generates a metadata blob from the relay chain for transaction signing.","operationId":"metadata_blob_rc","requestBody":{"description":"Request with \'tx\' field and optional \'at\' block","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Metadata blob","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/parse":{"post":{"tags":["rc"],"summary":"Parse transaction (relay chain)","description":"Decode a raw transaction using relay chain metadata. Only available on parachains. Returns the decoded pallet/method, call arguments, signature info, nonce, tip, era, and hash. Note: This endpoint uses the relay chain\'s current (latest) metadata for decoding. Transactions created for older runtime versions may fail to decode if the extrinsic format has changed.","operationId":"parse_rc","requestBody":{"description":"Transaction with \'tx\' field containing hex-encoded extrinsic","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseRequest"}}},"required":true},"responses":{"200":{"description":"Parsed transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseResponse"}}}},"400":{"description":"Invalid transaction or relay chain not configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseError"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain unavailable"}}}},"/v1/runtime/code":{"get":{"tags":["runtime"],"summary":"Runtime Wasm code","description":"Returns the Wasm code blob of the Substrate runtime at a given block.","operationId":"runtime_code","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Runtime code","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/runtime/metadata":{"get":{"tags":["runtime"],"summary":"Runtime metadata","description":"Returns the decoded runtime metadata in JSON format.","operationId":"runtime_metadata","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Runtime metadata","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/runtime/metadata/versions":{"get":{"tags":["runtime"],"summary":"Available metadata versions","description":"Returns the available metadata versions at a given block.","operationId":"runtime_metadata_versions","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of available metadata versions","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/runtime/metadata/{version}":{"get":{"tags":["runtime"],"summary":"Runtime metadata by version","description":"Returns the metadata at a specific version. The version parameter should be in \'vX\' format (e.g., \'v14\', \'v15\').","operationId":"runtime_metadata_versioned","parameters":[{"name":"version","in":"path","description":"Metadata version (e.g., \'v14\', \'v15\')","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Runtime metadata at specified version","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid version format or block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/runtime/spec":{"get":{"tags":["runtime"],"summary":"Runtime specification","description":"Returns the runtime specification including version, APIs, and chain properties.","operationId":"runtime_spec","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Runtime specification","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction":{"post":{"tags":["transaction"],"summary":"Submit transaction","description":"Submit a signed extrinsic to the transaction pool.","operationId":"submit","requestBody":{"description":"Signed extrinsic with \'tx\' field containing hex-encoded transaction","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Transaction hash","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/dry-run":{"post":{"tags":["transaction"],"summary":"Dry run transaction","description":"Dry run a transaction to check validity without submitting.","operationId":"dry_run","requestBody":{"description":"Transaction with \'tx\', \'senderAddress\', and optional \'at\' fields","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Dry run result","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/fee-estimate":{"post":{"tags":["transaction"],"summary":"Estimate transaction fee","description":"Estimate the fee for a transaction.","operationId":"fee_estimate","requestBody":{"description":"Transaction with \'tx\' field containing hex-encoded transaction","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Fee estimate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeEstimateResponse"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/material":{"get":{"tags":["transaction"],"summary":"Transaction construction material","description":"Returns network information needed for transaction construction including genesis hash, spec version, and optionally metadata.","operationId":"material","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"noMeta","in":"query","description":"DEPRECATED: If true, metadata is not included","required":false,"schema":{"type":"boolean"}},{"name":"metadata","in":"query","description":"Metadata format: \'json\' or \'scale\'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Transaction material","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/material/{metadataVersion}":{"get":{"tags":["transaction"],"summary":"Transaction material with versioned metadata","description":"Returns transaction construction material with metadata at a specific version.","operationId":"material_versioned","parameters":[{"name":"metadataVersion","in":"path","description":"Metadata version (e.g., \'v14\', \'v15\')","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"noMeta","in":"query","description":"DEPRECATED: If true, metadata is not included","required":false,"schema":{"type":"boolean"}},{"name":"metadata","in":"query","description":"Metadata format: \'json\' or \'scale\'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Transaction material with versioned metadata","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/metadata-blob":{"post":{"tags":["transaction"],"summary":"Generate metadata blob","description":"Generates a metadata blob for transaction signing with the CheckMetadataHash extension.","operationId":"metadata_blob","requestBody":{"description":"Request with \'tx\' field and optional \'at\' block","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Metadata blob","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/parse":{"post":{"tags":["transaction"],"summary":"Parse transaction","description":"Decode a raw transaction and return its components without executing or submitting it. Returns the decoded pallet/method, call arguments, signature info, nonce, tip, era, and hash. Note: This endpoint uses the chain\'s current (latest) metadata for decoding. Transactions created for older runtime versions may fail to decode if the extrinsic format has changed.","operationId":"parse","requestBody":{"description":"Transaction with \'tx\' field containing hex-encoded extrinsic","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseRequest"}}},"required":true},"responses":{"200":{"description":"Parsed transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseResponse"}}}},"400":{"description":"Invalid transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseError"}}}},"500":{"description":"Internal server error"}}}},"/v1/version":{"get":{"tags":["version"],"summary":"API version","description":"Returns the current version of the Polkadot REST API.","operationId":"get_version","responses":{"200":{"description":"API version","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionResponse"}}}}}}}},"components":{"schemas":{"AccountCompareResponse":{"type":"object","description":"Response for GET /accounts/compare","required":["areEqual","addresses"],"properties":{"addresses":{"type":"array","items":{"$ref":"#/components/schemas/AddressDetails"},"description":"Details for each address"},"areEqual":{"type":"boolean","description":"Whether all addresses have the same underlying public key"}}},"AccountConvertResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/convert","required":["ss58Prefix","network","address","accountId","scheme","publicKey"],"properties":{"accountId":{"type":"string","description":"The original AccountId (hex)"},"address":{"type":"string","description":"The SS58-encoded address"},"network":{"type":"string","description":"Network name corresponding to the SS58 prefix"},"publicKey":{"type":"boolean","description":"Whether the input was treated as a public key"},"scheme":{"type":"string","description":"The cryptographic scheme used"},"ss58Prefix":{"type":"integer","format":"int32","description":"SS58 prefix used for encoding","minimum":0}}},"AccountValidateResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/validate","required":["isValid"],"properties":{"accountId":{"type":["string","null"],"description":"The account ID in hex format (null if invalid)"},"isValid":{"type":"boolean","description":"Whether the address is valid"},"network":{"type":["string","null"],"description":"The network name for the prefix (null if invalid/unknown)"},"ss58Prefix":{"type":["string","null"],"description":"The SS58 prefix (null if invalid)"}}},"AddressDetails":{"type":"object","description":"Details about a single address","required":["ss58Format"],"properties":{"network":{"type":["string","null"],"description":"The network name for the prefix (null if invalid/unknown)"},"publicKey":{"type":["string","null"],"description":"The public key in hex format (null if invalid)"},"ss58Format":{"type":"string","description":"The original SS58 format address"},"ss58Prefix":{"type":["integer","null"],"format":"int32","description":"The SS58 prefix (null if invalid)","minimum":0}}},"AssetApprovalResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/asset-approvals","required":["at"],"properties":{"ahTimestamp":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"The approved amount (null if approval doesn\'t exist)"},"at":{"$ref":"#/components/schemas/BlockInfo"},"deposit":{"type":["string","null"],"description":"The deposit associated with the approval (null if approval doesn\'t exist)"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"AssetBalance":{"type":"object","description":"Asset balance information","required":["assetId","balance","isFrozen","isSufficient"],"properties":{"assetId":{"type":"string","description":"Asset ID as string (matches Sidecar format)"},"balance":{"type":"string","description":"Balance as string (u128 serialized as decimal string)"},"isFrozen":{"type":"boolean"},"isSufficient":{"type":"boolean"}}},"AssetBalancesResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/asset-balances","required":["at","assets"],"properties":{"ahTimestamp":{"type":["string","null"]},"assets":{"type":"array","items":{"$ref":"#/components/schemas/AssetBalance"}},"at":{"$ref":"#/components/schemas/BlockInfo"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"BalanceInfoResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/balance-info","required":["at","nonce","tokenSymbol","free","reserved","miscFrozen","feeFrozen","frozen","transferable","locks"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"feeFrozen":{"type":"string","description":"The amount that free may not drop below when withdrawing specifically for\\ntransaction fee payment (legacy field, may be string message for newer runtimes)"},"free":{"type":"string","description":"Free balance (not equivalent to spendable balance)"},"frozen":{"type":"string","description":"Frozen balance (newer runtimes, may be string message for older runtimes)"},"locks":{"type":"array","items":{"$ref":"#/components/schemas/BalanceLock"},"description":"Array of balance locks"},"miscFrozen":{"type":"string","description":"The amount that free may not drop below when withdrawing for anything except\\ntransaction fee payment (legacy field, may be string message for newer runtimes)"},"nonce":{"type":"string","description":"Account nonce"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]},"reserved":{"type":"string","description":"Reserved balance"},"tokenSymbol":{"type":"string","description":"Token symbol"},"transferable":{"type":"string","description":"Calculated transferable balance using: free - max(maybeED, frozen - reserved)"}}},"BalanceLock":{"type":"object","description":"Balance lock information","required":["id","amount","reasons"],"properties":{"amount":{"type":"string","description":"Amount locked"},"id":{"type":"string","description":"Lock identifier"},"reasons":{"type":"string","description":"Lock reasons (Fee = 0, Misc = 1, All = 2)"}}},"BlockInfo":{"type":"object","description":"Block information","required":["hash","height"],"properties":{"hash":{"type":"string"},"height":{"type":"string"}}},"CapabilitiesResponse":{"type":"object","required":["chain","pallets"],"properties":{"chain":{"type":"string"},"pallets":{"type":"array","items":{"type":"string"}}}},"ClaimedReward":{"type":"object","description":"Claimed reward status for a specific era","required":["era","status"],"properties":{"era":{"type":"string","description":"Era index"},"status":{"type":"string","description":"Claim status (\\"claimed\\" or \\"unclaimed\\")"}}},"EraPayouts":{"oneOf":[{"$ref":"#/components/schemas/EraPayoutsData","description":"Successful payout data for an era"},{"type":"object","description":"Error message when payouts cannot be calculated","required":["message"],"properties":{"message":{"type":"string"}}}],"description":"Payouts for a single era - can be either actual payouts or an error message"},"EraPayoutsData":{"type":"object","description":"Actual payout data for an era","required":["era","totalEraRewardPoints","totalEraPayout","payouts"],"properties":{"era":{"type":"string","description":"Era index"},"payouts":{"type":"array","items":{"$ref":"#/components/schemas/ValidatorPayout"},"description":"Individual payouts for validators nominated"},"totalEraPayout":{"type":"string","description":"Total payout for the era"},"totalEraRewardPoints":{"type":"string","description":"Total reward points for the era"}}},"FeeEstimateResponse":{"type":"object","required":["weight","class","partialFee"],"properties":{"class":{"type":"string"},"partialFee":{"type":"string"},"weight":{"$ref":"#/components/schemas/Weight"}}},"HealthResponse":{"type":"object","required":["status"],"properties":{"connected_chains":{"type":["integer","null"],"minimum":0},"status":{"type":"string"},"uptime":{"type":["integer","null"],"format":"int64","minimum":0}}},"MethodInfo":{"type":"object","description":"Method information (pallet and method name).","required":["pallet","method"],"properties":{"method":{"type":"string","description":"Method name in lowerCamelCase","example":"transferAllowDeath"},"pallet":{"type":"string","description":"Pallet name in lowerCamelCase","example":"balances"}}},"NodeVersionResponse":{"type":"object","required":["clientVersion","clientImplName","chain"],"properties":{"chain":{"type":"string"},"clientImplName":{"type":"string"},"clientVersion":{"type":"string"}}},"NominationsInfo":{"type":"object","description":"Nominations information for a nominator","required":["targets","submittedIn","suppressed"],"properties":{"submittedIn":{"type":"string","description":"Era in which nomination was submitted"},"suppressed":{"type":"boolean","description":"Whether nominations are suppressed"},"targets":{"type":"array","items":{"type":"string"},"description":"List of validator addresses being nominated"}}},"ParseError":{"type":"object","description":"Error response for transaction parsing failures.","required":["code","error","transaction","cause","stack"],"properties":{"cause":{"type":"string","description":"Cause of the error"},"code":{"type":"integer","format":"int32","description":"HTTP status code","example":400,"minimum":0},"error":{"type":"string","description":"Error message","example":"Failed to parse transaction."},"stack":{"type":"string","description":"Stack trace"},"transaction":{"type":"string","description":"The transaction that failed to parse"}}},"ParseRequest":{"type":"object","description":"Request body for transaction parsing.","properties":{"tx":{"type":["string","null"],"description":"Hex-encoded extrinsic with optional 0x prefix.","example":"0x4902840004316d995f..."}}},"ParseResponse":{"type":"object","description":"Response for successful transaction parsing.","required":["isSigned","method","args","era","hash"],"properties":{"args":{"type":"object","description":"Decoded call arguments"},"era":{"type":"object","description":"Era/mortality information"},"hash":{"type":"string","description":"Blake2-256 hash of the extrinsic","example":"0x1234567890abcdef..."},"isSigned":{"type":"boolean","description":"Whether the extrinsic is signed","example":true},"method":{"$ref":"#/components/schemas/MethodInfo","description":"Pallet and method information"},"nonce":{"type":["string","null"],"description":"Account nonce (only present for signed extrinsics)","example":"42"},"signature":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SignatureInfo","description":"Signature information (only present for signed extrinsics)"}]},"tip":{"type":["string","null"],"description":"Tip amount (only present for signed extrinsics)","example":"0"}}},"PoolAssetApprovalResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/pool-asset-approvals","required":["at"],"properties":{"ahTimestamp":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"The approved amount (null if approval doesn\'t exist)"},"at":{"$ref":"#/components/schemas/BlockInfo"},"deposit":{"type":["string","null"],"description":"The deposit associated with the approval (null if approval doesn\'t exist)"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"PoolAssetBalance":{"type":"object","description":"Pool asset balance information","required":["assetId","balance","isFrozen","isSufficient"],"properties":{"assetId":{"type":"string","description":"Asset ID as string (matches Sidecar format)"},"balance":{"type":"string","description":"Balance as string (u128 serialized as decimal string)"},"isFrozen":{"type":"boolean"},"isSufficient":{"type":"boolean"}}},"PoolAssetBalancesResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/pool-asset-balances","required":["at","poolAssets"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"poolAssets":{"type":"array","items":{"$ref":"#/components/schemas/PoolAssetBalance"}},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"ProxyDefinition":{"type":"object","description":"A proxy definition containing the delegate, proxy type, and delay","required":["delegate","proxyType","delay"],"properties":{"delay":{"type":"string","description":"The announcement delay in blocks"},"delegate":{"type":"string","description":"The delegate address that can act on behalf of the account"},"proxyType":{"type":"string","description":"The type of proxy (e.g., \\"Any\\", \\"Staking\\", \\"Governance\\", etc.)"}}},"ProxyInfoResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/proxy-info","required":["at","delegatedAccounts","depositHeld"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"delegatedAccounts":{"type":"array","items":{"$ref":"#/components/schemas/ProxyDefinition"},"description":"Array of delegated accounts with their proxy definitions"},"depositHeld":{"type":"string","description":"The deposit held for the proxies"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"RcBalanceInfoResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/balance-info","required":["at","nonce","tokenSymbol","free","reserved","miscFrozen","feeFrozen","frozen","transferable","locks"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"feeFrozen":{"type":"string","description":"The amount that free may not drop below when withdrawing specifically for\\ntransaction fee payment (legacy field, may be string message for newer runtimes)"},"free":{"type":"string","description":"Free balance (not equivalent to spendable balance)"},"frozen":{"type":"string","description":"Frozen balance (newer runtimes, may be string message for older runtimes)"},"locks":{"type":"array","items":{"$ref":"#/components/schemas/BalanceLock"},"description":"Array of balance locks"},"miscFrozen":{"type":"string","description":"The amount that free may not drop below when withdrawing for anything except\\ntransaction fee payment (legacy field, may be string message for newer runtimes)"},"nonce":{"type":"string","description":"Account nonce"},"reserved":{"type":"string","description":"Reserved balance"},"tokenSymbol":{"type":"string","description":"Token symbol"},"transferable":{"type":"string","description":"Calculated transferable balance using: free - max(maybeED, frozen - reserved)"}}},"RcProxyInfoResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/proxy-info","required":["at","delegatedAccounts","depositHeld"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"delegatedAccounts":{"type":"array","items":{"$ref":"#/components/schemas/ProxyDefinition"},"description":"Array of delegated accounts with their proxy definitions"},"depositHeld":{"type":"string","description":"The deposit held for the proxies"}}},"RcStakingInfoResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/staking-info","required":["at","controller","rewardDestination","numSlashingSpans","staking"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"controller":{"type":"string","description":"Controller account address"},"nominations":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NominationsInfo","description":"Nominations info (null if not a nominator)"}]},"numSlashingSpans":{"type":"string","description":"Number of slashing spans"},"rewardDestination":{"$ref":"#/components/schemas/RewardDestination","description":"Where rewards are paid to"},"staking":{"$ref":"#/components/schemas/StakingLedger","description":"Staking ledger"}}},"RcStakingPayoutsResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/staking-payouts","required":["at","erasPayouts"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"erasPayouts":{"type":"array","items":{"$ref":"#/components/schemas/EraPayouts"},"description":"Array of era payouts"}}},"RcVestingInfoResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/vesting-info","required":["at","vesting"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"vesting":{"type":"array","items":{"$ref":"#/components/schemas/VestingSchedule"},"description":"Array of vesting schedules (empty array if no vesting)"}}},"RewardDestination":{"oneOf":[{"type":"object","description":"Rewards are automatically re-staked","required":["staked"],"properties":{"staked":{"default":null}}},{"type":"object","description":"Rewards are sent to the stash account","required":["stash"],"properties":{"stash":{"default":null}}},{"type":"object","description":"Rewards are sent to the controller account","required":["controller"],"properties":{"controller":{"default":null}}},{"type":"object","description":"No reward destination","required":["none"],"properties":{"none":{"default":null}}},{"type":"object","description":"Rewards are sent to a specific account","required":["account"],"properties":{"account":{"type":"string","description":"Rewards are sent to a specific account"}}}],"description":"Reward destination - e.g. { \\"staked\\": null }, { \\"stash\\": null }, { \\"account\\": \\"...\\" }"},"SignatureInfo":{"type":"object","description":"Signature information for signed extrinsics.","required":["signer","signature"],"properties":{"signature":{"type":"string","description":"Hex-encoded signature","example":"0xa24152685f52e4726466e80247d965bb3d349637fc8a1ea6f7cc1451ddec98b5..."},"signer":{"$ref":"#/components/schemas/SignerId","description":"Signer account"}}},"SignerId":{"type":"object","description":"Signer identifier.","required":["id"],"properties":{"id":{"type":"string","description":"SS58-encoded account address","example":"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"}}},"StakingInfoResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/staking-info","required":["at","controller","rewardDestination","numSlashingSpans","staking"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"controller":{"type":"string","description":"Controller address"},"nominations":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NominationsInfo","description":"Nomination info (null if not a nominator)"}]},"numSlashingSpans":{"type":"string","description":"Number of slashing spans"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]},"rewardDestination":{"$ref":"#/components/schemas/RewardDestination","description":"Reward destination configuration"},"staking":{"$ref":"#/components/schemas/StakingLedger","description":"Staking ledger information"}}},"StakingLedger":{"type":"object","description":"Staking ledger information","required":["stash","total","active","unlocking"],"properties":{"active":{"type":"string","description":"Active staked balance"},"claimedRewards":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ClaimedReward"},"description":"Claimed rewards per era (only when includeClaimedRewards=true)"},"stash":{"type":"string","description":"Stash account address"},"total":{"type":"string","description":"Total locked balance (active + unlocking)"},"unlocking":{"type":"array","items":{"$ref":"#/components/schemas/UnlockingChunk"},"description":"Unlocking chunks with value and era"}}},"StakingPayoutsResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/staking-payouts","required":["at","erasPayouts"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"erasPayouts":{"type":"array","items":{"$ref":"#/components/schemas/EraPayouts"},"description":"Array of era payouts"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"TransactionPoolEntry":{"type":"object","required":["hash","encodedExtrinsic"],"properties":{"encodedExtrinsic":{"type":"string"},"hash":{"type":"string"},"partialFee":{"type":["string","null"]},"priority":{"type":["string","null"]},"tip":{"type":["string","null"]}}},"TransactionPoolResponse":{"type":"object","required":["pool"],"properties":{"pool":{"type":"array","items":{"$ref":"#/components/schemas/TransactionPoolEntry"}}}},"UnlockingChunk":{"type":"object","description":"Unlocking chunk with value and era when funds become available","required":["value","era"],"properties":{"era":{"type":"string","description":"Era when funds become available"},"value":{"type":"string","description":"Amount being unlocked"}}},"ValidatorPayout":{"type":"object","description":"Payout information for a single validator","required":["validatorId","nominatorStakingPayout","claimed","totalValidatorRewardPoints","validatorCommission","totalValidatorExposure","nominatorExposure"],"properties":{"claimed":{"type":"boolean","description":"Whether the reward has been claimed"},"nominatorExposure":{"type":"string","description":"Nominator\'s stake behind this validator"},"nominatorStakingPayout":{"type":"string","description":"Calculated payout amount for the nominator"},"totalValidatorExposure":{"type":"string","description":"Total stake behind this validator"},"totalValidatorRewardPoints":{"type":"string","description":"Validator\'s reward points for this era"},"validatorCommission":{"type":"string","description":"Validator\'s commission (as parts per billion, 0-1000000000)"},"validatorId":{"type":"string","description":"Validator stash account ID"}}},"VersionResponse":{"type":"object","required":["version"],"properties":{"version":{"type":"string"}}},"VestingInfoResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/vesting-info","required":["at","vesting"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]},"vesting":{"type":"array","items":{"$ref":"#/components/schemas/VestingSchedule"},"description":"Array of vesting schedules (empty array if no vesting)"}}},"VestingSchedule":{"type":"object","description":"A vesting schedule","required":["locked","perBlock","startingBlock"],"properties":{"locked":{"type":"string","description":"Total tokens locked at start of vesting"},"perBlock":{"type":"string","description":"Tokens unlocked per block"},"startingBlock":{"type":"string","description":"Block when vesting begins"}}},"Weight":{"type":"object","required":["refTime","proofSize"],"properties":{"proofSize":{"type":"string"},"refTime":{"type":"string"}}}}},"tags":[{"name":"health","description":"Health check"},{"name":"node","description":"Connected node information"},{"name":"version","description":"API version"},{"name":"blocks","description":"Block queries and extrinsic data"},{"name":"accounts","description":"Account balance, staking, and proxy information"},{"name":"pallets","description":"Runtime pallet metadata, storage, constants, events, errors"},{"name":"runtime","description":"Runtime specification, metadata, and code"},{"name":"transaction","description":"Transaction submission, fee estimation, and construction material"},{"name":"coretime","description":"Coretime system information"},{"name":"paras","description":"Parachain inclusion data"},{"name":"ahm","description":"Asset Hub Migration information"},{"name":"capabilities","description":"API capabilities and chain pallets"},{"name":"rc","description":"Relay chain endpoints (available on parachains only)"}]}');function S(e){return S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},S(e)}function I(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,r)}return t}function w(e,n,t){return(n=P(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function R(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,o,i,s=[],c=!0,l=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;c=!1}else for(;!(c=(r=o.call(t)).done)&&(s.push(r.value),s.length!==n);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(l)throw a}}return s}}(e,n)||E(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function E(e,n){if(e){if("string"==typeof e)return _(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_(e,n):void 0}}function _(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t3?(a=h===r)&&(c=o[(s=o[4])?5:(s=3,3)],o[4]=o[5]=e):o[0]<=m&&((a=t<2&&mr||r>h)&&(o[4]=t,o[5]=r,u.n=h,s=0))}if(a||t>1)return i;throw p=!0,r}return function(a,d,h){if(l>1)throw TypeError("Generator is already running");for(p&&1===d&&m(d,h),s=d,c=h;(n=s<2?e:c)||!p;){o||(s?s<3?(s>1&&(u.n=-1),m(s,c)):u.n=c:u.v=c);try{if(l=2,o){if(s||(a="next"),n=o[a]){if(!(n=n.call(o,c)))throw TypeError("iterator result is not an object");if(!n.done)return n;c=n.value,s<2&&(s=0)}else 1===s&&(n=o.return)&&n.call(o),s<2&&(c=TypeError("The iterator does not provide a '"+a+"' method"),s=1);o=e}else if((n=(p=u.n<0)?c:t.call(r,u))!==i)break}catch(n){o=e,s=1,c=n}finally{l=1}}return{value:n,done:p}}}(t,a,o),!0),l}var i={};function s(){}function c(){}function l(){}n=Object.getPrototypeOf;var d=[][r]?n(n([][r]())):(T(n={},r,function(){return this}),n),p=l.prototype=s.prototype=Object.create(d);function u(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,T(e,a,"GeneratorFunction")),e.prototype=Object.create(p),e}return c.prototype=l,T(p,"constructor",l),T(l,"constructor",c),c.displayName="GeneratorFunction",T(l,a,"GeneratorFunction"),T(p),T(p,a,"Generator"),T(p,r,function(){return this}),T(p,"toString",function(){return"[object Generator]"}),(q=function(){return{w:o,m:u}})()}function T(e,n,t,r){var a=Object.defineProperty;try{a({},"",{})}catch(e){a=0}T=function(e,n,t,r){function o(n,t){T(e,n,function(e){return this._invoke(n,t,e)})}n?a?a(e,n,{value:t,enumerable:!r,configurable:!r,writable:!r}):e[n]=t:(o("next",0),o("throw",1),o("return",2))},T(e,n,t,r)}function A(e,n,t,r,a,o,i){try{var s=e[o](i),c=s.value}catch(e){return void t(e)}s.done?n(c):Promise.resolve(c).then(r,a)}function C(e,n){for(var t=0;t0}).sort(function(e,n){return e.name.localeCompare(n.name)})}},{key:"getAllSchemas",value:function(){return Array.from(this.schemas.values()).sort(function(e,n){return e.name.localeCompare(n.name)})}},{key:"search",value:function(e){if(!e||e.length<2)return{endpoints:[],schemas:[]};var n=e.toLowerCase(),t={endpoints:[],schemas:[]};return this.endpoints.forEach(function(e){"".concat(e.path," ").concat(e.summary," ").concat(e.description," ").concat(e.tags.join(" ")).toLowerCase().includes(n)&&t.endpoints.push(e)}),this.schemas.forEach(function(e){"".concat(e.name," ").concat(e.description||"").toLowerCase().includes(n)&&t.schemas.push(e)}),t.endpoints.sort(function(e,t){return(e.path.toLowerCase().includes(n)?0:1)-(t.path.toLowerCase().includes(n)?0:1)}),t.schemas.sort(function(e,t){return(e.name.toLowerCase().includes(n)?0:1)-(t.name.toLowerCase().includes(n)?0:1)}),t}},{key:"getApiInfo",value:function(){var e,n,t,r,a;return this.spec?{title:(null===(e=this.spec.info)||void 0===e?void 0:e.title)||"API Documentation",description:(null===(n=this.spec.info)||void 0===n?void 0:n.description)||"",version:(null===(t=this.spec.info)||void 0===t?void 0:t.version)||"1.0.0",contact:(null===(r=this.spec.info)||void 0===r?void 0:r.contact)||{},license:(null===(a=this.spec.info)||void 0===a?void 0:a.license)||{},servers:this.spec.servers||[]}:null}},{key:"getServers",value:function(){var e;return(null===(e=this.spec)||void 0===e?void 0:e.servers)||[]}},{key:"formatEndpointPath",value:function(e){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"")+e.path}},{key:"generateExampleRequest",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",t=this.formatEndpointPath(e,n),r=e.method,a="curl -X ".concat(r,' "').concat(t,'"');if("GET"!==r&&(a+=' \\\n -H "Content-Type: application/json"'),e.requestBody){var o,i=null===(o=e.requestBody.content)||void 0===o?void 0:o["application/json"];null!=i&&i.example&&(a+=" \\\n -d '".concat(JSON.stringify(i.example,null,2),"'"))}return a}},{key:"getMethodColorClass",value:function(e){return{GET:"method-get",POST:"method-post",PUT:"method-put",DELETE:"method-delete",PATCH:"method-patch",HEAD:"method-head",OPTIONS:"method-options"}[e]||"method-default"}},{key:"generateExampleFromSchema",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Set;if(n>10)return"...";if(!e)return null;if(0===n){var r=JSON.stringify(e);if(this.exampleCache.has(r))return this.exampleCache.get(r);var a=this._generateExampleFromSchemaInternal(e,n,t);return this.exampleCache.set(r,a),a}return this._generateExampleFromSchemaInternal(e,n,t)}},{key:"_generateExampleFromSchemaInternal",value:function(e){var n=this,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Set;if(t>10)return"...";if(!e)return null;if(e.$ref){var a=this.resolveRef(e.$ref);if(!a||r.has(a))return"[Reference to ".concat(a,"]");r.add(a);var o=this.schemas.get(a);if(o){var i=this._generateExampleFromSchemaInternal(o,t+1,r);return r.delete(a),i}return"[".concat(a," schema not found]")}if(e.oneOf&&e.oneOf.length>0)return this._generateExampleFromSchemaInternal(e.oneOf[0],t+1,r);if(e.anyOf&&e.anyOf.length>0)return this._generateExampleFromSchemaInternal(e.anyOf[0],t+1,r);if(e.allOf&&e.allOf.length>0){var s,c={},l=function(e){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=E(e))){n&&(e=n);var t=0,r=function(){};return{s:r,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){i=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(i)throw a}}}}(e.allOf);try{for(l.s();!(s=l.n()).done;){var d=s.value,p=this._generateExampleFromSchemaInternal(d,t+1,r);p&&"object"===S(p)&&Object.assign(c,p)}}catch(e){l.e(e)}finally{l.f()}return Object.keys(c).length>0?c:null}if("array"===e.type&&e.items)return[this._generateExampleFromSchemaInternal(e.items,t+1,r)];if("object"===e.type){var u={};return e.properties&&Object.entries(e.properties).forEach(function(e){var a=R(e,2),o=a[0],i=a[1];u[o]=n._generateExampleFromSchemaInternal(i,t+1,r)}),u}return this.generateExampleForPrimitive(e)}},{key:"generateExampleForPrimitive",value:function(e){var n=e.type,t=e.format;if(void 0!==e.example)return e.example;if(e.enum&&e.enum.length>0)return e.enum[0];if(t)switch(t){case"SS58":return"15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5";case"unsignedInteger":return"1000000000000";case"$hex":return"0x1234567890abcdef";case"date-time":return"2023-01-01T12:00:00.000Z";case"uuid":return"123e4567-e89b-12d3-a456-426614174000";case"email":return"example@email.com";case"uri":return"https://example.com";case"binary":return"base64EncodedData"}switch(n){case"string":return e.description&&e.description.toLowerCase().includes("hash")?"0x1234567890abcdef1234567890abcdef12345678":e.description&&e.description.toLowerCase().includes("address")?"15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5":"example_string";case"number":case"integer":return 123;case"boolean":return!0;default:return null}}},{key:"generateExampleResponse",value:function(e){var n,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"200";if(!e.responses||!e.responses[t])return null;var r=null===(n=e.responses[t].content)||void 0===n?void 0:n["application/json"];return r&&r.schema?this.generateExampleFromSchema(r.schema):null}},{key:"getAllExampleResponses",value:function(e){var n=this;if(!e.responses)return{};var t={};return Object.entries(e.responses).forEach(function(r){var a=R(r,2),o=a[0],i=a[1],s=n.generateExampleResponse(e,o);null!==s&&(t[o]={description:i.description,example:s})}),t}}],n&&C(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t,r}();function j(e){return j="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},j(e)}function z(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,o,i,s=[],c=!0,l=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;c=!1}else for(;!(c=(r=o.call(t)).done)&&(s.push(r.value),s.length!==n);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(l)throw a}}return s}}(e,n)||function(e,n){if(e){if("string"==typeof e)return O(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?O(e,n):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function O(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t\n ').concat(e.capitalizeFirst(t.name),'\n ').concat(t.endpoints.length,'\n \n \n \n \n \n "),n.appendChild(r)}),this.parser.getAllSchemas().slice(0,20).forEach(function(e){var n=document.createElement("li");n.className="nav-item",n.innerHTML='\n \n 📋\n ').concat(e.name,"\n \n "),t.appendChild(n)}))}},{key:"renderEndpoint",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(!e)return"";var t=this.parser.generateExampleRequest(e,n);return'\n
\n
\n
\n ').concat(e.method,'\n

').concat(e.path,'

\n
\n
\n ').concat(e.tags.map(function(e){return''.concat(e,"")}).join(""),'\n
\n
\n\n
\n ').concat(e.summary?'

'.concat(e.summary,"

"):"","\n ").concat(e.description?'
'.concat(this.formatDescription(e.description),"
"):"","\n\n ").concat(this.renderParameters(e.parameters),"\n ").concat(this.renderRequestBody(e.requestBody),"\n ").concat(this.renderResponses(e.responses),"\n ").concat(this.renderExampleRequest(t,e),"\n
\n
\n ")}},{key:"renderParameters",value:function(e){var n=this;if(!e||0===e.length)return"";var t=this.groupParametersByLocation(e);return'\n
\n

Parameters

\n '.concat(Object.entries(t).map(function(e){var t=z(e,2),r=t[0],a=t[1];return'\n
\n

'.concat(n.capitalizeFirst(r),' Parameters

\n
\n ').concat(a.map(function(e){return n.renderParameter(e)}).join(""),"\n
\n
\n ")}).join(""),"\n
\n ")}},{key:"groupParametersByLocation",value:function(e){return e.reduce(function(e,n){var t=n.in||"query";return e[t]||(e[t]=[]),e[t].push(n),e},{})}},{key:"renderParameter",value:function(e){var n=this.getTypeInfo(e.schema);return'\n
\n
\n
\n '.concat(e.name,"\n ").concat(e.required?'required':'optional','\n
\n
').concat(n,"
\n ").concat(e.description?'
'.concat(e.description,"
"):"","\n
\n
\n ")}},{key:"renderRequestBody",value:function(e){return e?'\n
\n

Request Body

\n '.concat(e.required?'required':"","\n ").concat(e.description?'

'.concat(e.description,"

"):"","\n ").concat(this.renderContent(e.content),"\n
\n "):""}},{key:"renderResponses",value:function(e){var n=this;return e&&0!==Object.keys(e).length?'\n
\n

Responses

\n
\n '.concat(Object.entries(e).map(function(e){var t=z(e,2),r=t[0],a=t[1];return n.renderResponse(r,a)}).join(""),"\n
\n
\n "):""}},{key:"renderResponse",value:function(e,n){var t=this.getStatusClass(e);return'\n
\n
\n ').concat(e,'\n ').concat(n.description,"\n
\n ").concat(n.content?this.renderContent(n.content):"","\n
\n ")}},{key:"renderContent",value:function(e){var n=this;return e?'\n
\n '.concat(Object.entries(e).map(function(e){var t=z(e,2),r=t[0],a=t[1];return'\n
\n

'.concat(r,"

\n ").concat(a.schema?n.renderSchema(a.schema):"","\n ").concat(a.example?n.renderExample(a.example,r):"","\n ").concat(a.schema?n.renderSchemaExample(a.schema,r):"","\n
\n ")}).join(""),"\n
\n "):""}},{key:"renderSchema",value:function(e){var n=this,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!e)return"";if(t>3)return'
Schema too deep...
';if(e.$ref){var r=e.resolvedRef;return'\n \n ")}return"object"===e.type&&e.properties?'\n
\n
object
\n
\n ').concat(Object.entries(e.properties).map(function(r){var a,o=z(r,2),i=o[0],s=o[1];return'\n
\n
\n '.concat(i,"\n ").concat(null!==(a=e.required)&&void 0!==a&&a.includes(i)?'required':"",'\n ').concat(n.getTypeInfo(s),"\n
\n ").concat(s.description?'
'.concat(s.description,"
"):"","\n ").concat(n.renderSchema(s,t+1),"\n
\n ")}).join(""),"\n
\n
\n "):"array"===e.type&&e.items?'\n
\n
array of:
\n ').concat(this.renderSchema(e.items,t+1),"\n
\n "):'\n
\n ').concat(this.getTypeInfo(e),"\n ").concat(e.description?''.concat(e.description,""):"","\n
\n ")}},{key:"renderExample",value:function(e,n){var t=this.formatExample(e,n),r=this.getLanguageFromMediaType(n);return'\n
\n
\n Example\n \n
\n
\n
').concat(this.escapeHtml(t),"
\n
\n
\n ")}},{key:"renderSchemaExample",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"application/json";if(!e)return"";try{var t=this.parser.generateExampleFromSchema(e);if(!t)return'\n
\n
\n Generated Example Response\n
\n
Unable to generate example from this schema
\n
\n ';var r=this.formatExample(t,n);return'\n
\n
\n Generated Example Response\n \n
\n
\n
').concat(this.escapeHtml(r),'
\n
\n
\n 💡 This example was automatically generated from the API schema\n
\n ').concat(this.renderDataSchemaSection(e),"\n
\n ")}catch(n){return console.error("Error generating example from schema:",n,e),'\n
\n
\n Generated Example Response\n
\n
\n ⚠️ Error generating example\n Schema processing failed: '.concat(n.message,"\n
\n
\n ")}}},{key:"renderDataSchemaSection",value:function(e){if(!e)return"";var n=this.extractSchemaReferences(e);return 0===n.length?"":'\n
\n
\n 📋 Data Schema\n
\n \n \n
\n ')}},{key:"extractSchemaReferences",value:function(e){var n=this,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Set,r=new Set;if(!e||"object"!==j(e))return Array.from(r);if(e.$ref){var a=this.parser.resolveRef(e.$ref);if(a&&!t.has(a)){r.add(a),t.add(a);var o=this.parser.getSchema(a);o&&this.extractSchemaReferences(o,t).forEach(function(e){return r.add(e)})}}return e.oneOf&&e.oneOf.forEach(function(e){n.extractSchemaReferences(e,t).forEach(function(e){return r.add(e)})}),e.anyOf&&e.anyOf.forEach(function(e){n.extractSchemaReferences(e,t).forEach(function(e){return r.add(e)})}),e.allOf&&e.allOf.forEach(function(e){n.extractSchemaReferences(e,t).forEach(function(e){return r.add(e)})}),e.items&&this.extractSchemaReferences(e.items,t).forEach(function(e){return r.add(e)}),e.properties&&Object.values(e.properties).forEach(function(e){n.extractSchemaReferences(e,t).forEach(function(e){return r.add(e)})}),Array.from(r)}},{key:"renderExampleRequest",value:function(e,n){return'\n
\n

Try this endpoint

\n '.concat(this.renderParameterInputs(n),"\n ").concat(this.renderGeneratedCurl(n),"\n
\n ")}},{key:"renderParameterInputs",value:function(e){var n=this;if(!e.parameters||0===e.parameters.length)return this.renderSimpleEndpoint(e);var t=e.parameters.filter(function(e){return"path"===e.in}),r=e.parameters.filter(function(e){return"query"===e.in});return'\n
\n ').concat(t.length>0?'\n
\n

Required Parameters

\n '.concat(t.map(function(t){return n.renderParameterInput(t,e.id,!0)}).join(""),"\n
\n "):"","\n \n ").concat(r.length>0?'\n
\n

Optional Parameters

\n '.concat(r.map(function(t){return n.renderParameterInput(t,e.id,!1)}).join(""),"\n
\n "):"",'\n\n
\n \n \n
\n
\n ')}},{key:"renderParameterInput",value:function(e,n,t){var r=this.getParameterPlaceholder(e),a=t?"required":"";return'\n
\n \n \n
\n ")}},{key:"renderSimpleEndpoint",value:function(e){return"curl -X ".concat(e.method.toUpperCase(),' "http://localhost:8080').concat(e.path,'"'),'\n
\n

This endpoint requires no parameters.

\n
\n \n \n
\n \n \n
\n ')}},{key:"renderGeneratedCurl",value:function(e){return'\n \n \n ')}},{key:"getParameterPlaceholder",value:function(e){var n,t=e.name.toLowerCase();if("usercblock"===t)return"true";if(t.includes("address")||t.includes("account"))return"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";if(t.includes("hash")||t.includes("blockhash"))return"0x1234...abcdef";if(t.includes("block")||t.includes("number")||t.includes("height"))return"1000000";if(t.includes("limit"))return"10";if(t.includes("page"))return"1";switch((null===(n=e.schema)||void 0===n?void 0:n.type)||e.type||"string"){case"integer":case"number":return"123";case"boolean":return"true";default:return"Enter ".concat(e.name)}}},{key:"generateEnhancedCurl",value:function(e,n){var t=this;if(!e)return"";var r=n+e.path,a=e.method.toUpperCase();if(e.parameters&&e.parameters.filter(function(e){return"path"===e.in}).forEach(function(e){var n=t.getParameterExample(e);r=r.replace("{".concat(e.name,"}"),n)}),e.parameters){var o=e.parameters.filter(function(e){return"query"===e.in});if(o.length>0){var i=o.map(function(e){var n=t.getParameterExample(e);return"".concat(e.name,"=").concat(n)}).join("&");r+="?".concat(i)}}var s="curl -X ".concat(a);if("GET"!==a&&(s+=' -H "Content-Type: application/json"'),e.requestBody&&("POST"===a||"PUT"===a||"PATCH"===a)){var c=this.generateExampleRequestBody(e.requestBody);c&&(s+=" \\\\\n -d '".concat(c,"'"))}return s+' \\\\\n "'.concat(r,'"')}},{key:"getParameterExample",value:function(e){var n,t;if(void 0!==e.example)return e.example;if(void 0!==(null===(n=e.schema)||void 0===n?void 0:n.example))return e.schema.example;var r=(null===(t=e.schema)||void 0===t?void 0:t.type)||e.type||"string",a=e.name.toLowerCase();if(a.includes("id"))return"12345";if(a.includes("hash")||a.includes("blockhash"))return"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";if(a.includes("address")||a.includes("account"))return"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";if(a.includes("block"))return"1000000";if(a.includes("number")||a.includes("height"))return"1000";if(a.includes("limit"))return"10";if(a.includes("page"))return"1";if(a.includes("at"))return"1000000";if(a.includes("from"))return"0";if(a.includes("to"))return"100";switch(r){case"integer":case"number":return"123";case"boolean":return"true";default:return"example"}}},{key:"generateExampleRequestBody",value:function(e){if(!e||!e.content)return null;var n=e.content["application/json"];return n&&n.schema?JSON.stringify({example:"request body - replace with actual data"}):null}},{key:"renderSchemaPage",value:function(e){return e?'\n
\n
\n

').concat(e.name,'

\n
\n ').concat(e.type||"object",'\n
\n
\n\n
\n ').concat(e.description?'

'.concat(e.description,"

"):"",'\n \n
\n

Schema Definition

\n ').concat(this.renderSchema(e),"\n
\n
\n
\n "):""}},{key:"capitalizeFirst",value:function(e){return e.charAt(0).toUpperCase()+e.slice(1)}},{key:"truncatePath",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:30;return e.length>n?e.substring(0,n)+"...":e}},{key:"getTypeInfo",value:function(e){if(!e)return"unknown";var n=e.type||"object";return e.format&&(n+=" (".concat(e.format,")")),e.$ref&&(n=e.resolvedRef||"reference"),n}},{key:"getStatusClass",value:function(e){var n=parseInt(e);return n>=200&&n<300?"status-success":n>=300&&n<400?"status-redirect":n>=400&&n<500?"status-client-error":n>=500?"status-server-error":"status-default"}},{key:"formatDescription",value:function(e){return e.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/`(.*?)`/g,"$1").replace(/\n/g,"
")}},{key:"formatExample",value:function(e,n){return"application/json"===n?"string"==typeof e?e:JSON.stringify(e,null,2):"string"==typeof e?e:JSON.stringify(e)}},{key:"getLanguageFromMediaType",value:function(e){return{"application/json":"json","application/xml":"xml","text/plain":"text","text/html":"html","application/x-www-form-urlencoded":"text"}[e]||"text"}},{key:"escapeHtml",value:function(e){var n=document.createElement("div");return n.textContent=e,n.innerHTML}}],n&&L(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n}();function H(e){return H="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(e)}function D(e,n){for(var t=0;t0||e.schemas.length>0){var n='\n
\n '.concat(e.endpoints.length>0?this.renderEndpointResults(e.endpoints):"","\n ").concat(e.schemas.length>0?this.renderSchemaResults(e.schemas):"","\n
\n ");this.searchResults.innerHTML=n,this.showResults()}else this.renderNoResults()}},{key:"renderEndpointResults",value:function(e){var n=this,t=e.slice(0,8);return'\n
\n
\n

Endpoints

\n '.concat(e.length,'\n
\n
\n ').concat(t.map(function(e){return n.renderEndpointResult(e)}).join(""),"\n ").concat(e.length>8?'\n
\n +'.concat(e.length-8," more endpoints\n
\n "):"","\n
\n
\n ")}},{key:"renderEndpointResult",value:function(e){return'\n
\n
\n ').concat(e.method,'\n ').concat(e.path,'\n
\n
\n ').concat(e.summary||e.description||"No description available","\n
\n ").concat(e.tags.length>0?'\n
\n '.concat(e.tags.map(function(e){return''.concat(e,"")}).join(""),"\n
\n "):"","\n
\n ")}},{key:"renderSchemaResults",value:function(e){var n=this,t=e.slice(0,6);return'\n
\n
\n

Schemas

\n '.concat(e.length,'\n
\n
\n ').concat(t.map(function(e){return n.renderSchemaResult(e)}).join(""),"\n ").concat(e.length>6?'\n
\n +'.concat(e.length-6," more schemas\n
\n "):"","\n
\n
\n ")}},{key:"renderSchemaResult",value:function(e){return'\n
\n
\n 📋\n ').concat(e.name,'\n ').concat(e.type||"object","\n
\n ").concat(e.description?'\n
\n '.concat(this.truncateText(e.description,100),"\n
\n "):"","\n
\n ")}},{key:"renderNoResults",value:function(){this.searchResults.innerHTML='\n
\n
🔍
\n
\n

No results found

\n Try different keywords or check your spelling\n
\n
\n ',this.showResults()}},{key:"showResults",value:function(){this.searchResults&&(this.searchResults.style.display="block")}},{key:"hideResults",value:function(){this.searchResults&&(this.searchResults.style.display="none")}},{key:"clear",value:function(){this.searchResults&&(this.searchResults.innerHTML="",this.hideResults())}},{key:"highlightText",value:function(e,n){if(!n||!e)return e;var t=new RegExp("(".concat(this.escapeRegExp(n),")"),"gi");return e.replace(t,"$1")}},{key:"escapeRegExp",value:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}},{key:"truncateText",value:function(e,n){return e.length<=n?e:e.substring(0,n).trim()+"..."}},{key:"filterByTag",value:function(e){var n=this.parser.tags.get(e);return n?n.endpoints:[]}},{key:"getSuggestions",value:function(e){if(!e||e.length<2)return[];var n=new Set,t=e.toLowerCase();return this.parser.endpoints.forEach(function(e){e.path.toLowerCase().includes(t)&&n.add(e.path)}),this.parser.schemas.forEach(function(e){e.name.toLowerCase().includes(t)&&n.add(e.name)}),this.parser.tags.forEach(function(e){e.name.toLowerCase().includes(t)&&n.add(e.name)}),Array.from(n).slice(0,5)}},{key:"advancedSearch",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.query,t=void 0===n?"":n,r=e.tags,a=void 0===r?[]:r,o=e.methods,i=void 0===o?[]:o,s=e.responseStatus,c=void 0===s?[]:s,l=e.hasParameters,d=void 0===l?null:l,p={endpoints:[],schemas:[]};return p=t?this.search(t):{endpoints:Array.from(this.parser.endpoints.values()),schemas:Array.from(this.parser.schemas.values())},a.length>0&&(p.endpoints=p.endpoints.filter(function(e){return e.tags.some(function(e){return a.includes(e)})})),i.length>0&&(p.endpoints=p.endpoints.filter(function(e){return i.includes(e.method)})),c.length>0&&(p.endpoints=p.endpoints.filter(function(e){return Object.keys(e.responses).some(function(e){return c.includes(e)})})),null!==d&&(p.endpoints=p.endpoints.filter(function(e){var n=e.parameters&&e.parameters.length>0;return d?n:!n})),p}},{key:"getSearchStats",value:function(){return{totalEndpoints:this.parser.endpoints.size,totalSchemas:this.parser.schemas.size,totalTags:this.parser.tags.size,endpointsByMethod:this.getEndpointsByMethod(),endpointsByTag:this.getEndpointsByTag()}}},{key:"getEndpointsByMethod",value:function(){var e={};return this.parser.endpoints.forEach(function(n){e[n.method]||(e[n.method]=0),e[n.method]++}),e}},{key:"getEndpointsByTag",value:function(){var e={};return this.parser.tags.forEach(function(n){e[n.name]=n.endpoints.length}),e}}],n&&D(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n}();function F(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t
').concat(V(a.trim()),"
"),r++,o}),o=[],i=function(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return F(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?F(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){t&&(e=t);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,s=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return i=e.done,e},e:function(e){s=!0,o=e},f:function(){try{i||null==t.return||t.return()}finally{if(s)throw o}}}}((a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=function(e){return e.replace(/^(\|[^|\n]+(?:\|[^|\n]*)*\|)\s*\n(\|[\s\-:|]+\|)\s*\n((?:^\|[^|\n]+(?:\|[^|\n]*)*\|\s*$\n?)+)/gm,function(e,n,t,r){var a=n.split("|").map(function(e){return e.trim()}).filter(function(e){return e}).map(function(e){return e.replace(/`([^`]+)`/g,"$1")}).map(function(e){return"".concat(e,"")}).join(""),o=r.trim().split("\n").filter(function(e){return e.trim()&&e.includes("|")}).map(function(e){var n=e.split("|").map(function(e){return e.trim()}).filter(function(e){return e}).map(function(e){return e.replace(/`([^`]+)`/g,"$1")}).map(function(e){return"".concat(e,"")}).join("");return"".concat(n,"")}).join("\n");return'
\n\n\n'.concat(a,"\n\n\n").concat(o,"\n\n
\n
")})}(a=a.replace(/## ⚠️ Important: (.*$)/gm,'
⚠️ Important: $1
'))).replace(/^> \*\*Note\*\*: (.*$)/gm,'
Note: $1
')).replace(/^> \*\*Important\*\*: (.*$)/gm,'
Important: $1
')).replace(/^> (.*$)/gm,"
$1
")).replace(/^# (.*$)/gm,function(e,n){var t=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");return'

').concat(n,"

")})).replace(/^## (.*$)/gm,function(e,n){var t=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");return'

').concat(n,"

")})).replace(/^### (.*$)/gm,function(e,n){var t=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");return'

').concat(n,"

")})).replace(/^#### (.*$)/gm,function(e,n){var t=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");return'

').concat(n,"

")})).replace(/\*\*(.*?)\*\*/g,"$1")).replace(/\*(.*?)\*/g,"$1")).replace(/`([^`]+)`/g,"$1")).replace(/\[([^\]]+)\]\(([^)]+)\)/g,function(e,n,t){return t.startsWith("#")?'').concat(n,""):'').concat(n,"")})).replace(/^- (.*$)/gm,"
  • $1
  • ")).replace(/^\d+\. (.*$)/gm,"
  • $1
  • ")).split(/\n\s*\n/));try{for(i.s();!(n=i.n()).done;){var s=n.value;if(s=s.trim())if(s.startsWith("")){var c=/^\d+\./.test(s.split("\n")[0])?"ol":"ul";o.push("<".concat(c,">").concat(s,""))}else o.push("

    ".concat(s.replace(/\n/g," "),"

    "))}}catch(e){i.e(e)}finally{i.f()}a=(a=o.join("\n\n")).replace(/<\/(ul|ol)>\s*<\1>/g,"");for(var l=0;l":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,function(e){return n[e]})}var W={"asset-hub-migration":$('# Asset Hub Migration & Elastic Scaling Guide\n\nThis comprehensive guide explains how to configure Asset Hub migration in Substrate API Sidecar and understand the related elastic scaling changes that prepare the API for future multi-block scenarios.\n\n## ⚠️ Important: Niche Feature Notice\n\n**The `useRcBlock` parameter and elastic scaling functionality is a specialized feature designed for stakeholders who specifically need to track Asset Hub blocks using relay chain block references.** \n\n**If you are not planning to use the relay chain as a way to track Asset Hub state, you can safely ignore everything related to `useRcBlock` and elastic scaling in this guide.** Standard Asset Hub queries will continue to work exactly as before without any configuration changes.\n\n## Environment Variables\n\n### Required Configuration\n\nTo properly handle Asset Hub migration, you need to configure two environment variables:\n\n1. `SAS_SUBSTRATE_URL`: The primary WebSocket URL for your Asset Hub node\n2. `SAS_SUBSTRATE_MULTI_CHAIN_URL`: A JSON array containing additional chain configurations\n\n### Important Note on Node Requirements\n\nIf you need to use any of the endpoints that require multi-chain configuration (like `/pallets/staking/progress`), you will need to run two separate nodes:\n- One node for the Asset Hub chain\n- One node for the relay chain\n\nBoth nodes must be running and accessible for these endpoints to function properly.\n\n### Multi-Chain Configuration\n\nThe `SAS_SUBSTRATE_MULTI_CHAIN_URL` environment variable accepts a JSON array of chain configurations. Each configuration object should contain:\n\n- `url`: The WebSocket URL for the additional node\n- `type`: The type of chain (can be \'relay\', \'assethub\', \'parachain\', or undefined)\n\nCurrently, this configuration is primarily used for:\n- Querying staking information\n- Retrieving additional session/babe information from the relay chain\n\nIn future releases, this configuration will also be used to improve performance by allowing Sidecar to retrieve information from multiple nodes.\n\n## Example Configuration\n\nHere\'s an example configuration for Westend network:\n\n```bash\n# Primary Asset Hub node\nSAS_SUBSTRATE_URL=wss://westend-asset-hub-rpc.polkadot.io\n\n# Additional chain configuration (relay chain in this case)\nSAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"wss://westend-rpc.polkadot.io","type":"relay"}]\'\n```\n\n## Affected Endpoints\n\nCurrently, only the following endpoint requires the multi-chain configuration:\n- `/pallets/staking/progress`\n\nThe `/pallets/staking/progress` endpoint requires two chains because it needs to combine information from both chains:\n- The Asset Hub chain provides era information from the staking pallet\n- The relay chain provides additional storage information from the babe pallet\n\nThis dual-chain requirement is specific to this endpoint, as it needs to gather information from both sources to provide complete staking progress data.\n\n## Elastic Scaling & Response Structure Changes\n\n> **Note**: This section only applies if you are using the `useRcBlock` parameter. If you\'re not using relay chain block tracking, you can skip this entire section.\n\n**Important**: All endpoints that support the `useRcBlock` parameter return array responses instead of single enhanced objects (when used). This prepares the API for Polkadot/Kusama elastic scaling where multiple Asset Hub blocks could exist per relay chain block.\n\n### What Changed\n\n#### New Array Response Behavior\n\nWhen using `useRcBlock` parameter, endpoints now return an array of response objects:\n\n```json\n[\n {\n "at": {\n "hash": "0x...",\n "height": "1234567"\n },\n "data": "...",\n "rcBlockNumber": "5678901",\n "ahTimestamp": "1234567890"\n }\n]\n```\n\nIf no Asset Hub blocks are found for the specified relay chain block, an empty array is returned:\n\n```json\n[]\n```\n\n#### Affected Parameters\n\n- **`useRcBlock`**: When set to \'true\', uses the relay chain block specified in the \'at\' parameter to determine corresponding Asset Hub block(s)\n\n#### Response Format Summary\n\n- **With `useRcBlock=true`**: Returns `[{...result, rcBlockNumber, ahTimestamp}]` or `[]`\n- **Without `useRcBlock`**: Returns single response object (unchanged)\n\n### Affected Endpoints\n\n> **Note**: These endpoints only change behavior when using `useRcBlock=true`. Without this parameter, they work exactly as before.\n\nAll the following endpoints support the `useRcBlock` parameter and return array responses when it\'s used:\n\n#### Account Endpoints\n- `/accounts/{accountId}/asset-balances`\n- `/accounts/{accountId}/asset-approvals`\n- `/accounts/{accountId}/pool-asset-balances`\n- `/accounts/{accountId}/pool-asset-approvals`\n- `/accounts/{accountId}/balance-info`\n- `/accounts/{accountId}/staking-info`\n- `/accounts/{accountId}/staking-payouts`\n- `/accounts/{accountId}/vesting-info`\n- `/accounts/{accountId}/proxy-info`\n\n#### Block Endpoints (useRcBlock)\n- `/blocks/head`\n- `/blocks/{blockId}`\n- `/blocks/{blockId}/header`\n- `/blocks/head/header`\n- `/blocks/{blockId}/extrinsics/{extrinsicIndex}`\n- `/blocks/{blockId}/extrinsics-raw`\n- `/blocks`\n\n#### Pallets Endpoints\n- `/pallets/asset-conversion/next-available-id`\n- `/pallets/asset-conversion/liquidity-pools`\n- `/pallets/assets/{assetId}/asset-info`\n- `/pallets/{palletId}/consts`\n- `/pallets/{palletId}/consts/{constantItemId}`\n- `/pallets/{palletId}/dispatchables`\n- `/pallets/{palletId}/dispatchables/{dispatchableItemId}`\n- `/pallets/{palletId}/errors`\n- `/pallets/{palletId}/errors/{errorItemId}`\n- `/pallets/{palletId}/events`\n- `/pallets/{palletId}/events/{eventItemId}`\n- `/pallets/foreign-assets`\n- `/pallets/nomination-pools/info`\n- `/pallets/nomination-pools/{poolId}`\n- `/pallets/ongoing-referenda`\n- `/pallets/pool-assets/{assetId}/asset-info`\n- `/pallets/staking/progress`\n- `/pallets/staking/validators`\n- `/pallets/{palletId}/storage`\n- `/pallets/{palletId}/storage/{storageItemId}`\n\n## Migration Steps\n\n> **Important Reminder**: These migration steps are only necessary if you plan to use the `useRcBlock` parameter for relay chain block tracking. Standard Asset Hub functionality requires no migration.\n\n### 1. Complete Environment Setup\n\nEnsure your Substrate API Sidecar instance is configured with both Asset Hub and relay chain nodes:\n\n```bash\n# Asset Hub node (primary)\nSAS_SUBSTRATE_URL=wss://westend-asset-hub-rpc.polkadot.io\n\n# Relay chain node (secondary, required for useRcBlock functionality)\nSAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"wss://westend-rpc.polkadot.io","type":"relay"}]\'\n```\n\n### 2. Update Response Handling\n\nIf you\'re using `useRcBlock` parameter, update your code to handle array responses:\n\n```javascript\nconst response = await fetch(\'/accounts/123/balance-info?at=5000000&useRcBlock=true\');\nconst data = await response.json();\n\n// Handle array response\nif (data.length === 0) {\n console.log(\'No Asset Hub blocks found for this relay chain block\');\n} else {\n // Process each Asset Hub block (currently will be 0 or 1, but prepared for multiple)\n data.forEach(item => {\n console.log(item.free);\n console.log(item.rcBlockNumber);\n });\n}\n```\n\n### 3. Check for Empty Results\n\nThe new behavior returns empty arrays when no Asset Hub blocks are found:\n\n```javascript\nconst response = await fetch(\'/accounts/123/balance-info?at=5000000&useRcBlock=true\');\nconst data = await response.json();\n\nif (data.length === 0) {\n // No Asset Hub blocks found for this relay chain block\n console.log(\'No data available for this relay chain block\');\n return;\n}\n\n// Process results\nconst result = data[0]; // Get first (and currently only) result\n```\n\n### 4. Prepare for Future Elastic Scaling\n\nWhile current implementation returns 0 or 1 results, elastic scaling will enable multiple Asset Hub blocks per relay chain block:\n\n```javascript\nconst response = await fetch(\'/accounts/123/balance-info?at=5000000&useRcBlock=true\');\nconst data = await response.json();\n\n// Handle multiple Asset Hub blocks (future-ready)\ndata.forEach((block, index) => {\n console.log(`Asset Hub block ${index + 1}:`);\n console.log(`Block number: ${block.at.height}`);\n console.log(`RC block: ${block.rcBlockNumber}`);\n console.log(`Timestamp: ${block.ahTimestamp}`);\n});\n```\n\n## Backward Compatibility\n\n- **Regular queries** (without `useRcBlock`) continue to return single objects unchanged\n- **All existing functionality** remains the same for standard queries\n- **Only array structure** changes affect `useRcBlock` queries\n\n## Benefits\n\n1. **Asset Hub Migration Support**: Enables querying Asset Hub data using relay chain block references\n2. **Elastic Scaling Ready**: Prepared for multiple Asset Hub blocks per relay chain block\n3. **Consistent API**: All endpoints follow the same array response pattern\n4. **Predictable**: Empty arrays instead of errors when no blocks found\n\n## Examples\n\n### Single Result (Current Behavior)\n```bash\ncurl "https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/123/balance-info?at=20000000&useRcBlock=true"\n```\n\nResponse:\n```json\n[\n {\n "at": {\n "hash": "0x...",\n "height": "1234567"\n },\n "free": "1000000000000",\n "reserved": "0",\n "miscFrozen": "0",\n "feeFrozen": "0",\n "rcBlockNumber": "20000000",\n "ahTimestamp": "1705123456789"\n }\n]\n```\n\n### Empty Result (No Asset Hub Block Found)\n```bash\ncurl "https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/123/balance-info?at=999999999&useRcBlock=true"\n```\n\nResponse:\n```json\n[]\n```\n\n### Regular Query (Unchanged)\n```bash\ncurl "https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/123/balance-info"\n```\n\nResponse (unchanged):\n```json\n{\n "at": {\n "hash": "0x...",\n "height": "1234567"\n },\n "free": "1000000000000",\n "reserved": "0",\n "miscFrozen": "0",\n "feeFrozen": "0"\n}\n```\n\n## Historic Data Limitations\n\nThe `/pallets/staking/progress` endpoint currently does not support historic queries. This means you can only query the current staking progress state, and cannot retrieve historical staking progress data from past blocks.\n\nAll other endpoints will continue to work with just the primary node configuration (`SAS_SUBSTRATE_URL`).\n\n## Need Help?\n\nIf you encounter issues during migration, please:\n\n1. **First, verify multi-chain setup**: Ensure both Asset Hub and relay chain nodes are running and accessible\n2. **Check environment variables**: Verify `SAS_SUBSTRATE_URL` and `SAS_SUBSTRATE_MULTI_CHAIN_URL` are correctly configured\n3. **Test connectivity**: Ensure both WebSocket URLs are reachable from your Sidecar instance\n4. **Review array handling**: Update your client code to handle array responses when using `useRcBlock`\n5. **Check this guide**: Review the migration steps and examples above\n6. **Open an issue**: For persistent issues, create an issue on [GitHub](https://github.com/paritytech/substrate-api-sidecar/issues)\n\n**Remember**: The `useRcBlock` parameter requires both Asset Hub and relay chain APIs to be available and properly configured. Without proper multi-chain setup, these features will not work.\n\nThe changes enable Asset Hub migration support while preparing the API for future elastic scaling scenarios where multiple Asset Hub blocks could exist per relay chain block.\n'),"useRcBlock-spec":$('# Polkadot REST API: useRcBlock Query Parameters Specification\n\n## Prerequisites\nThe `useRcBlock` functionality requires two connection configurations:\n\n**Primary Connection (Asset Hub):**\n- `SAS_SUBSTRATE_URL`: Connection to Asset Hub node\n\n**Multi-Chain Connection (Relay Chain):**\n- `SAS_SUBSTRATE_MULTI_CHAIN_URL`: JSON array of chain configurations, each containing a `url` and `type` property. The `type` can be \'relay\', \'assethub\', \'parachain\', or undefined. Currently used for Asset Hub migration to query staking information and additional session/babe information from the relay chain. In future releases, this will also be used to improve performance by allowing Sidecar to retrieve information from multiple nodes. This environment variable should be used in combination with the `SAS_SUBSTRATE_URL` variable.\n\n**Example Configuration:**\n```\nSAS_SUBSTRATE_URL=wss://westend-asset-hub-rpc.polkadot.io\nSAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"wss://westend-rpc.polkadot.io","type":"relay"}]\'\n```\n\n## Query Parameters Overview\n\n### useRcBlock Parameter\nThe `useRcBlock` parameter is a boolean parameter that works in conjunction with the existing `at` parameter. When `useRcBlock=true`, the API queries relay chain data at the block specified by the `at` parameter, treating the `at` value as a relay chain block identifier instead of an Asset Hub block identifier.\n\n**Special Behavior**: When `useRcBlock=true` is used without an `at` parameter, the API will use the finalizedHead of the relay chain to get the associated Asset Hub block.\n\n**Block Finalization Note**: The `useRcBlock` parameter does not make any assumptions about whether the block you pass is finalized or a best block. It is recommended to ensure the block you are passing is finalized if block finalization is important for your use case.\n\n### format Parameter\nThe `format` parameter controls the response format when using `useRcBlock=true`. This parameter is only valid when `useRcBlock=true` is specified.\n\n**Values:**\n- `array` (default): Returns the standard array format with enhanced metadata\n- `object`: Wraps the response in an object containing relay chain block info and the parachain data array\n\n**Validation**: Using `format=object` without `useRcBlock=true` will return a `400 Bad Request` error.\n\n## Implementation: useRcBlock Query Parameter\n\n### Core Functionality\nThe `useRcBlock` parameter can be added to existing sidecar endpoints to query Asset Hub state using relay chain block identifiers.\n\n**Parameter Format:**\n```\nat=&useRcBlock=true\n```\n\n**Example Usage:**\n```\nGET /pallets/staking/progress?at=1000000&useRcBlock=true\nGET /accounts/{accountId}/balance-info?at=0x123abc&useRcBlock=true\nGET /blocks/head?useRcBlock=true\nGET /blocks/12345?at=12345&useRcBlock=true\n\n# With format=object for wrapped response format\nGET /pallets/staking/progress?at=1000000&useRcBlock=true&format=object\nGET /accounts/{accountId}/balance-info?at=0x123abc&useRcBlock=true&format=object\n```\n\n### Response Format Changes\n\n**Without useRcBlock (Traditional Behavior):**\nReturns single response object (unchanged):\n```json\n{\n // ... existing endpoint response data\n}\n```\n\n**With useRcBlock=true (default array format):**\nReturns array format with additional metadata:\n```json\n[{\n // ... existing endpoint response data\n "rcBlockHash": "0x1234567890abcdef...",\n "rcBlockNumber": "1000000",\n "ahTimestamp": "1642694400"\n}]\n```\n\nOr empty array `[]` if no corresponding Asset Hub block exists.\n\n**With useRcBlock=true&format=object:**\nReturns object format wrapping the data with relay chain block info:\n```json\n{\n "rcBlock": {\n "hash": "0x1234567890abcdef...",\n "parentHash": "0xabcdef1234567890...",\n "number": "1000000"\n },\n "parachainDataPerBlock": [\n {\n // ... existing endpoint response data\n "rcBlockHash": "0x1234567890abcdef...",\n "rcBlockNumber": "1000000",\n "ahTimestamp": "1642694400"\n }\n ]\n}\n```\n\nOr with empty `parachainDataPerBlock` array if no corresponding Asset Hub block exists:\n```json\n{\n "rcBlock": {\n "hash": "0x1234567890abcdef...",\n "parentHash": "0xabcdef1234567890...",\n "number": "1000000"\n },\n "parachainDataPerBlock": []\n}\n```\n\n## Supported Endpoints\n\n### Block Endpoints Supporting useRcBlock:\n\n1. **`/blocks/head`** - Get latest block using RC head block\n2. **`/blocks/head/header`** - Get latest block header using RC head block\n3. **`/blocks/{blockId}`** - Get single block by RC block identifier\n4. **`/blocks/{blockId}/header`** - Get block header by RC block identifier\n5. **`/blocks`** - Get block range where range represents RC block numbers (skips RC blocks without corresponding AH blocks)\n6. **`/blocks/{blockId}/extrinsics-raw`** - Get raw extrinsics by RC block identifier\n7. **`/blocks/{blockId}/extrinsics/{extrinsicIndex}`** - Get specific extrinsic by RC block identifier\n\n### Non-Block Endpoints Supporting useRcBlock:\nMost existing sidecar endpoints support the `useRcBlock` parameter, including:\n- `/pallets/*` endpoints\n- `/accounts/*` endpoints\n- Other state query endpoints\n\n## Key Features and Behavior\n\n### Enhanced Response Format\nWhen `useRcBlock=true` is used, responses include additional context fields:\n- `rcBlockHash`: The relay chain block hash\n- `rcBlockNumber`: The relay chain block number\n- `ahTimestamp`: The Asset Hub block timestamp\n- Array format (default) prepares for future elastic scaling scenarios\n- Object format (`format=object`) provides relay chain block metadata wrapper with `rcBlock` info (hash, parentHash, number) and `parachainDataPerBlock` array\n\n### Backward Compatibility\n- Defaults to `false`, maintaining existing functionality when not specified\n- Existing endpoints remain unchanged when `useRcBlock` is not used\n- No breaking changes to current API behavior\n\n### Graceful Handling\n- Range endpoints skip RC blocks without corresponding AH blocks\n- Returns empty array `[]` when no corresponding Asset Hub block exists\n- Multi-block scenarios are handled when Asset Hub produces multiple blocks within a single relay chain block period\n\n### Validation Logic\nThe `validateUseRcBlock` middleware ensures:\n1. **Boolean validation**: `useRcBlock` must be "true" or "false" string\n2. **Asset Hub requirement**: Only works when connected to Asset Hub\n3. **Relay chain availability**: Requires relay chain API configuration via `SAS_SUBSTRATE_MULTI_CHAIN_URL`\n4. **format dependency**: `format=object` requires `useRcBlock=true` to be specified\n5. **format values**: Must be either "array" or "object" string\n\n## Multi-Block and Elastic Scaling Scenarios\n\n### Multi-Block Scenarios\nWhen Asset Hub produces multiple blocks within a single relay chain block period (due to faster block times), the array response format accommodates multiple blocks. The array structure prepares the API for future elastic scaling requirements.\n\n### Elastic Scaling Preparation\nThe array response format is designed to support future elastic scaling scenarios where multiple Asset Hub blocks may be produced for a single relay chain block reference.\n\n---\n\n## Potential Future Enhancements\n\n### `enforceFinalizedBlockOnAt` Parameter (Suggested Safeguard)\n\nAn optional safeguard parameter `enforceFinalizedBlockOnAt` could be implemented to enforce that blocks passed via the at parameter are finalized. When `enforceFinalizedBlockOnAt=true`, the endpoint will error if the specified block is not finalized, providing additional safety for applications that require finalized block guarantees.\n'),"advanced-config":$('# Advanced Configuration Guide\n\nThis comprehensive guide covers all configuration options available in Polkadot REST API. All environment variables use the `SAS_` prefix for backwards compatibility with Substrate API Sidecar.\n\n## Table of Contents\n\n- [Server Configuration](#server-configuration)\n- [Substrate Node Connection](#substrate-node-connection)\n- [Logging Configuration](#logging-configuration)\n- [Metrics & Monitoring](#metrics--monitoring)\n- [Environment Profiles](#environment-profiles)\n- [Docker Configuration](#docker-configuration)\n\n## Server Configuration\n\nConfigure the HTTP server that serves the REST API.\n\n### Basic Server Settings\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_EXPRESS_BIND_HOST` | `127.0.0.1` | Network interface to bind to. **Use `0.0.0.0` for Docker** |\n| `SAS_EXPRESS_PORT` | `8080` | Port number (must be non-zero) |\n| `SAS_EXPRESS_KEEP_ALIVE_TIMEOUT` | `5000` | Keep-alive timeout in milliseconds |\n| `SAS_EXPRESS_REQUEST_LIMIT` | `512000` | Maximum request body size in bytes (500KB) |\n| `SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY` | `10` | Maximum concurrent block fetches for block range queries |\n\n> **Note:** The `SAS_EXPRESS_` prefix is an artifact of Substrate API Sidecar naming, preserved for backwards compatibility.\n\n**Example:**\n```bash\nexport SAS_EXPRESS_BIND_HOST=0.0.0.0\nexport SAS_EXPRESS_PORT=3000\nexport SAS_EXPRESS_KEEP_ALIVE_TIMEOUT=10000\nexport SAS_EXPRESS_REQUEST_LIMIT=1048576 # 1MB\nexport SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY=20\n```\n\n### Migrating from Sidecar\n\nThe following sidecar server variables are **not supported**:\n\n| Sidecar Variable | Status | Notes |\n|------------------|--------|-------|\n| `SAS_EXPRESS_MAX_BODY` | Replaced | Use `SAS_EXPRESS_REQUEST_LIMIT` (value in bytes, not a string like `100kb`) |\n| `SAS_EXPRESS_INJECTED_CONTROLLERS` | Not supported | Pallet-injected controllers are not available |\n\n## Substrate Node Connection\n\nConfigure connections to Substrate-based blockchain nodes.\n\n### Primary Node Connection\n\n| Variable | Required | Default | Description |\n|----------|----------|---------|-------------|\n| `SAS_SUBSTRATE_URL` | Yes | `ws://127.0.0.1:9944` | WebSocket or HTTP URL to node |\n\n**Supported protocols:** `ws://`, `wss://`, `http://`, `https://`\n\n### Reconnection Settings\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_SUBSTRATE_RECONNECT_INITIAL_DELAY_MS` | `100` | Initial delay before first reconnect attempt |\n| `SAS_SUBSTRATE_RECONNECT_MAX_DELAY_MS` | `10000` | Maximum delay between reconnect attempts (10s) |\n| `SAS_SUBSTRATE_RECONNECT_REQUEST_TIMEOUT_MS` | `30000` | Timeout for individual RPC requests (30s) |\n\n### Multi-Chain Configuration\n\nFor Asset Hub and multi-chain queries (e.g., `useRcBlock` functionality):\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `SAS_SUBSTRATE_MULTI_CHAIN_URL` | No | JSON array of chain configurations |\n\n**Format:**\n```json\n[{"url":"wss://relay-chain.com","type":"relay"}]\n```\n\n**Chain types:**\n- `relay` — Relay chain (Polkadot/Kusama)\n- `assethub` — Asset Hub parachain\n- `coretime` — Coretime chain\n- `parachain` — Other parachains (default)\n\n**Example configurations:**\n\n```bash\n# Single node (basic)\nexport SAS_SUBSTRATE_URL=wss://polkadot-rpc.polkadot.io\n\n# Asset Hub with relay chain (enables useRcBlock and RC endpoints)\nexport SAS_SUBSTRATE_URL=wss://polkadot-asset-hub-rpc.polkadot.io\nexport SAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"wss://polkadot-rpc.polkadot.io","type":"relay"}]\'\n\n# Local development\nexport SAS_SUBSTRATE_URL=ws://127.0.0.1:9944\nexport SAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"ws://127.0.0.1:9945","type":"relay"}]\'\n```\n\n### Migrating from Sidecar\n\nThe following sidecar substrate variables are **not supported**:\n\n| Sidecar Variable | Status | Notes |\n|------------------|--------|-------|\n| `SAS_SUBSTRATE_TYPES_BUNDLE` | Not needed | subxt handles type resolution automatically |\n| `SAS_SUBSTRATE_TYPES_CHAIN` | Not needed | subxt handles type resolution automatically |\n| `SAS_SUBSTRATE_TYPES_SPEC` | Not needed | subxt handles type resolution automatically |\n| `SAS_SUBSTRATE_TYPES` | Not needed | subxt handles type resolution automatically |\n| `SAS_SUBSTRATE_CACHE_CAPACITY` | Not implemented | Uses a different caching strategy |\n\n## Logging Configuration\n\nControl logging behavior and output formatting.\n\n### Log Levels\n\n| Variable | Default | Options | Description |\n|----------|---------|---------|-------------|\n| `SAS_LOG_LEVEL` | `info` | `error`, `warn`, `info`, `http`, `debug`, `trace` | Minimum log level |\n\n**HTTP Status Code Mapping:**\n- `< 400` — `http` level\n- `400-499` — `warn` level\n- `>= 500` — `error` level\n\n### Log Formatting\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_LOG_JSON` | `false` | Output logs in JSON format |\n| `SAS_LOG_STRIP_ANSI` | `false` | Remove ANSI color codes |\n\n### File Logging\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_LOG_WRITE` | `false` | Write logs to file |\n| `SAS_LOG_WRITE_PATH` | `./logs` | Directory for log files |\n| `SAS_LOG_WRITE_MAX_FILE_SIZE` | `5242880` | Max file size in bytes (5MB). Minimum: 1024 (1KB) |\n| `SAS_LOG_WRITE_MAX_FILES` | `5` | Max number of log files (minimum: 1) |\n\n**Example configurations:**\n\n```bash\n# Development logging\nexport SAS_LOG_LEVEL=debug\nexport SAS_LOG_JSON=false\n\n# Production logging\nexport SAS_LOG_LEVEL=info\nexport SAS_LOG_JSON=true\nexport SAS_LOG_WRITE=true\nexport SAS_LOG_WRITE_PATH=/var/log/polkadot-rest-api\n\n# Verbose debugging\nexport SAS_LOG_LEVEL=trace\nexport SAS_LOG_STRIP_ANSI=true\n```\n\n### Migrating from Sidecar\n\n| Sidecar Variable | Status | Notes |\n|------------------|--------|-------|\n| `SAS_LOG_FILTER_RPC` | Not implemented | polkadot-js API-WS RPC filtering is not applicable (uses subxt, not polkadot-js) |\n| `SAS_LOG_LEVEL=silly` | Not supported | Use `trace` instead (most verbose level) |\n| `SAS_LOG_LEVEL=verbose` | Not supported | Use `debug` instead |\n\n## Metrics & Monitoring\n\nEnable Prometheus metrics and Loki logging integration.\n\n### Metrics Server\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_METRICS_ENABLED` | `false` | Enable metrics collection |\n| `SAS_METRICS_PROM_HOST` | `127.0.0.1` | Prometheus server host (IP address or hostname) |\n| `SAS_METRICS_PROM_PORT` | `9100` | Prometheus server port |\n| `SAS_METRICS_PROMETHEUS_PREFIX` | `polkadot_rest_api` | Prometheus metric name prefix |\n| `SAS_METRICS_INCLUDE_QUERYPARAMS` | `false` | Include query params in metrics labels |\n\n### Loki Integration\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_METRICS_LOKI_HOST` | `127.0.0.1` | Loki server host (IP address or hostname) |\n| `SAS_METRICS_LOKI_PORT` | `3100` | Loki server port |\n\n### Metrics Endpoints\n\nWhen `SAS_METRICS_ENABLED=true`, the following endpoints become available:\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET /metrics` | Prometheus text format |\n| `GET /metrics.json` | JSON format |\n\n### Prometheus Prefix\n\nThe `SAS_METRICS_PROMETHEUS_PREFIX` must follow Prometheus naming conventions:\n- Must start with `[a-zA-Z_:]`\n- May contain only `[a-zA-Z0-9_:]`\n- Default: `polkadot_rest_api` (all metrics are prefixed, e.g., `polkadot_rest_api_http_requests_total`)\n\n**Example setup:**\n\n```bash\n# Enable metrics\nexport SAS_METRICS_ENABLED=true\nexport SAS_METRICS_PROM_PORT=9090\nexport SAS_METRICS_INCLUDE_QUERYPARAMS=true\n\n# With external monitoring stack\nexport SAS_METRICS_PROM_HOST=prometheus.monitoring.svc\nexport SAS_METRICS_LOKI_HOST=loki.monitoring.svc\n\n# Custom prefix\nexport SAS_METRICS_PROMETHEUS_PREFIX=my_api\n```\n\n## Environment Profiles\n\nUse different configuration profiles for various environments.\n\n### Using .env Files\n\nPolkadot REST API supports loading configuration from `.env` files using the `--env-file` CLI argument:\n\n```bash\n# Use a specific env file\npolkadot-rest-api --env-file .env.production\n\n# Default: looks for .env in the current directory\npolkadot-rest-api\n```\n\n### Example Profiles\n\n**.env.local (Development):**\n```bash\nSAS_SUBSTRATE_URL=ws://127.0.0.1:9944\nSAS_EXPRESS_BIND_HOST=127.0.0.1\nSAS_EXPRESS_PORT=8080\nSAS_LOG_LEVEL=debug\nSAS_METRICS_ENABLED=false\n```\n\n**.env.production (Production):**\n```bash\nSAS_SUBSTRATE_URL=wss://polkadot-rpc.polkadot.io\nSAS_EXPRESS_BIND_HOST=0.0.0.0\nSAS_EXPRESS_PORT=8080\nSAS_LOG_LEVEL=info\nSAS_LOG_JSON=true\nSAS_LOG_WRITE=true\nSAS_LOG_WRITE_PATH=/var/log/polkadot-rest-api\nSAS_METRICS_ENABLED=true\nSAS_EXPRESS_KEEP_ALIVE_TIMEOUT=30000\n```\n\n**.env.docker (Docker):**\n```bash\nSAS_SUBSTRATE_URL=ws://host.docker.internal:9944\nSAS_EXPRESS_BIND_HOST=0.0.0.0\nSAS_EXPRESS_PORT=8080\nSAS_LOG_JSON=true\n```\n\n## Docker Configuration\n\n### Dockerfile\n\nThe project uses a multi-stage build:\n\n1. **Build stage**: `rust:1.90.0-slim-bookworm` — compiles the release binary\n2. **Runtime stage**: `debian:bookworm-slim` — minimal image with only `ca-certificates`\n\nThe final image runs as the `nobody` user and includes these defaults:\n- `RUST_LOG=info`\n- `SAS_EXPRESS_PORT=8080`\n- `SAS_EXPRESS_BIND_HOST=0.0.0.0`\n\n### Running with Docker\n\n```bash\n# Pull the image\ndocker pull docker.io/parity/polkadot-rest-api:latest\n\n# Run with defaults (connects to host node)\ndocker run --rm -it --read-only -p 8080:8080 \\\n -e SAS_SUBSTRATE_URL=ws://host.docker.internal:9944 \\\n parity/polkadot-rest-api\n\n# Run with env file\ndocker run --rm -it --read-only --env-file .env.docker -p 8080:8080 \\\n parity/polkadot-rest-api\n```\n\n> **Tip**: Always use `--read-only` for containers in production.\n\n### Docker Compose\n\nThe `docker-compose.yml` provides a full stack with monitoring:\n\n```yaml\nservices:\n polkadot: # Polkadot node\n rest-api: # Polkadot REST API\n loki: # Log aggregation\n cadvisor: # Container metrics\n prometheus: # Metrics storage\n grafana: # Dashboards (admin/admin)\n```\n\n**Quick start:**\n```bash\ndocker-compose up\n```\n\nThis starts:\n- Polkadot node syncing via warp sync on port `9944`\n- REST API on port `8080` (connected to local node)\n- Loki on port `3100`\n- cAdvisor on port `8081`\n- Prometheus on port `9090`\n- Grafana on port `3000` (default credentials: `admin`/`admin`)\n\n### Docker Networking Notes\n\n- The Dockerfile sets `SAS_EXPRESS_BIND_HOST=0.0.0.0` by default — no need to override\n- Use Docker service names for inter-container communication (e.g., `ws://polkadot:9944`)\n- Use `host.docker.internal` to access services on the Docker host\n\n### Migrating from Sidecar Docker Setup\n\n| Change | Details |\n|--------|---------|\n| **Image name** | `parity/substrate-api-sidecar` → `parity/polkadot-rest-api` |\n| **Service name** | `sidecar` → `rest-api` (in docker-compose) |\n| **Base image** | Node.js Alpine → Debian slim (smaller runtime, no Node.js needed) |\n| **Run user** | `node` → `nobody` |\n| **Bind host** | Must set `SAS_EXPRESS_BIND_HOST=0.0.0.0` via env | Set in Dockerfile by default |\n| **Health check** | `curl http://localhost:8080/blocks/head` → `curl http://localhost:8080/v1/blocks/head` |\n| **Prometheus port** | Separate port `9100` exposed | Served on main port at `/metrics` |\n\n## Configuration Validation\n\nThe API validates all configuration on startup and will exit with an error if any value is invalid.\n\n### Testing Configuration\n\n```bash\n# Test the API is running\ncurl http://localhost:8080/v1/blocks/head\n\n# Check health\ncurl http://localhost:8080/v1/health\n\n# Check metrics (if enabled)\ncurl http://localhost:8080/metrics\n\n# Verify node connection\ncurl http://localhost:8080/v1/node/version\n\n# Check API version\ncurl http://localhost:8080/v1/version\n\n# Check capabilities (supported pallets, chain type)\ncurl http://localhost:8080/v1/capabilities\n```\n\n### Common Issues\n\n**Connection refused:**\n- Check `SAS_SUBSTRATE_URL` is reachable\n- Verify WebSocket/HTTP protocol matches the node\n\n**Docker networking:**\n- The Dockerfile sets `SAS_EXPRESS_BIND_HOST=0.0.0.0` by default\n- Check port mapping: `-p host_port:container_port`\n\n**Invalid configuration:**\n- All env vars are validated on startup — check the error message\n- `SAS_EXPRESS_PORT` must be non-zero\n- `SAS_EXPRESS_REQUEST_LIMIT` must be non-zero\n- `SAS_LOG_LEVEL` must be one of: `trace`, `debug`, `http`, `info`, `warn`, `error`\n- `SAS_METRICS_PROMETHEUS_PREFIX` must follow Prometheus naming: start with `[a-zA-Z_:]`, contain only `[a-zA-Z0-9_:]`\n\n**Performance tuning:**\n- Increase `SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY` for faster block range queries (default: 10)\n- Tune `SAS_EXPRESS_KEEP_ALIVE_TIMEOUT` for long-running connections (default: 5000ms)\n- Adjust `SAS_SUBSTRATE_RECONNECT_*` values for unreliable RPC connections\n\n## Complete Example\n\nFull production configuration:\n\n```bash\n#!/bin/bash\n# Production Polkadot REST API Configuration\n\n# Server\nexport SAS_EXPRESS_BIND_HOST=0.0.0.0\nexport SAS_EXPRESS_PORT=8080\nexport SAS_EXPRESS_KEEP_ALIVE_TIMEOUT=30000\nexport SAS_EXPRESS_REQUEST_LIMIT=512000\nexport SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY=20\n\n# Blockchain connection\nexport SAS_SUBSTRATE_URL=wss://polkadot-rpc.polkadot.io\n\n# Reconnection\nexport SAS_SUBSTRATE_RECONNECT_INITIAL_DELAY_MS=100\nexport SAS_SUBSTRATE_RECONNECT_MAX_DELAY_MS=10000\nexport SAS_SUBSTRATE_RECONNECT_REQUEST_TIMEOUT_MS=30000\n\n# Asset Hub multi-chain setup\nexport SAS_SUBSTRATE_MULTI_CHAIN_URL=\'[\n {"url":"wss://polkadot-rpc.polkadot.io","type":"relay"}\n]\'\n\n# Logging\nexport SAS_LOG_LEVEL=info\nexport SAS_LOG_JSON=true\nexport SAS_LOG_WRITE=true\nexport SAS_LOG_WRITE_PATH=/var/log/polkadot-rest-api\nexport SAS_LOG_WRITE_MAX_FILE_SIZE=10485760 # 10MB\nexport SAS_LOG_WRITE_MAX_FILES=10\n\n# Metrics\nexport SAS_METRICS_ENABLED=true\nexport SAS_METRICS_PROM_HOST=0.0.0.0\nexport SAS_METRICS_PROM_PORT=9100\nexport SAS_METRICS_PROMETHEUS_PREFIX=polkadot_rest_api\nexport SAS_METRICS_LOKI_HOST=loki.monitoring.svc\nexport SAS_METRICS_LOKI_PORT=3100\n\n# Start\npolkadot-rest-api\n```\n\n---\n\nFor migration details from Substrate API Sidecar, see the [Migration Guide](./MIGRATION.md).\n'),"openapi-utoipa":$('# OpenAPI Documentation with utoipa\n\nThis project uses [utoipa](https://github.com/juhaku/utoipa) v5 to generate an OpenAPI 3.0 spec from handler annotations. The spec is served as interactive Swagger UI at `/docs` and raw JSON at `/api-docs/openapi.json`.\n\n## How it works\n\n1. Each handler function has a `#[utoipa::path(...)]` attribute describing its HTTP method, path, parameters, and responses.\n2. The macro generates a hidden `__path_` struct in the same module as the handler.\n3. `crates/server/src/openapi.rs` aggregates all handlers via `#[derive(OpenApi)]` with a `paths(...)` list.\n4. `crates/server/src/app.rs` serves the generated spec at `/api-docs/openapi.json` and a static Swagger UI page at `/docs`.\n\n## Adding a new endpoint\n\n### 1. Annotate the handler function\n\nAdd `#[utoipa::path(...)]` directly above your `pub async fn`. Pick the template that matches your handler type.\n\n**GET with path + query params:**\n\n```rust\n#[utoipa::path(\n get,\n path = "/v1/my-category/{myId}",\n tag = "my-category",\n summary = "Short title for Swagger UI sidebar",\n description = "Longer description shown when the endpoint is expanded.",\n params(\n ("myId" = String, Path, description = "The resource identifier"),\n ("at" = Option, Query, description = "Block identifier (number or hash)"),\n ("flag" = Option, Query, description = "Some boolean toggle"),\n ),\n responses(\n (status = 200, description = "Success", body = Object),\n (status = 400, description = "Invalid request"),\n (status = 500, description = "Internal server error"),\n )\n)]\npub async fn my_handler(...) -> ... { ... }\n```\n\n**POST with JSON body:**\n\n```rust\n#[utoipa::path(\n post,\n path = "/v1/transaction/my-action",\n tag = "transaction",\n summary = "Do something",\n description = "Does something with the submitted data.",\n request_body(content = Object, description = "JSON body with \'tx\' field"),\n responses(\n (status = 200, description = "Success", body = Object),\n (status = 400, description = "Invalid input"),\n )\n)]\npub async fn my_action(...) -> ... { ... }\n```\n\n**GET with no params:**\n\n```rust\n#[utoipa::path(\n get,\n path = "/v1/health",\n tag = "health",\n summary = "Health check",\n description = "Returns service health status.",\n responses(\n (status = 200, description = "Healthy", body = Object),\n )\n)]\npub async fn get_health(...) -> ... { ... }\n```\n\n> **Note on `body = Object`:** Most handlers return dynamic `serde_json::Value` data, so use `body = Object`. Only use a concrete type (e.g., `body = HealthResponse`) if the response struct derives `utoipa::ToSchema`.\n\n### 2. Ensure the handler\'s module is `pub mod`\n\nThe `#[utoipa::path]` macro generates a hidden struct `__path_` in the same module as the handler. This struct must be accessible from `openapi.rs`. If the module is declared as `mod my_handler;` (private), change it to `pub mod my_handler;` in the parent `mod.rs`.\n\n```rust\n// crates/server/src/handlers/my_category/mod.rs\n\npub mod my_handler; // must be `pub mod`, NOT `mod`\n\npub use my_handler::my_handler; // re-export is fine but doesn\'t help utoipa\n```\n\n### 3. Register the handler in `openapi.rs`\n\nAdd the handler\'s **full submodule path** to the `paths(...)` list in `crates/server/src/openapi.rs`.\n\n```rust\npaths(\n // ... existing paths ...\n\n // Use the FULL module path, not the re-exported name\n crate::handlers::my_category::my_handler_file::my_handler,\n)\n```\n\n**Critical:** Always use the path to the actual module file, not the re-exported path. `pub use` re-exports the function but NOT the `__path_*` struct that utoipa needs.\n\n```rust\n// WRONG - utoipa can\'t find __path_my_handler at this path\ncrate::handlers::my_category::my_handler,\n\n// CORRECT - utoipa finds __path_my_handler in the submodule\ncrate::handlers::my_category::my_handler_file::my_handler,\n```\n\n### 4. Pick the right tag\n\nUse an existing tag from `openapi.rs` so the endpoint groups properly in Swagger UI:\n\n| Tag | Use for |\n|-----|---------|\n| `health` | Health check endpoints |\n| `node` | Node version, network, tx pool |\n| `version` | API version |\n| `blocks` | Block queries |\n| `accounts` | Account balance, staking, proxy, vesting |\n| `pallets` | Pallet storage, consts, errors, events, dispatchables |\n| `runtime` | Runtime spec, metadata, code |\n| `transaction` | Submit, dry-run, fee-estimate, material |\n| `coretime` | Coretime info, leases, regions, renewals, reservations |\n| `paras` | Parachain inclusion |\n| `ahm` | Asset Hub Migration |\n| `capabilities` | API capabilities |\n| `rc` | All relay chain (`/rc/...`) endpoints |\n\nIf you need a new tag, add it to the `tags(...)` block in `openapi.rs`.\n\n### 5. Build and verify\n\n```bash\ncargo build --package polkadot-rest-api\ncargo test --package polkadot-rest-api\n```\n\nIf you get `could not find __path_`, check:\n1. Is the module `pub mod` in its parent `mod.rs`?\n2. Does the path in `openapi.rs` point to the **actual submodule**, not the re-exported name?\n\n**The sync test will catch you if you forget.** A test in `openapi.rs` (`openapi_paths_match_registered_routes`) automatically compares the route registry against the OpenAPI spec. It runs as part of `cargo test --package polkadot-rest-api` and will fail with a message like:\n\n```\nRoutes registered but MISSING from OpenAPI spec:\n - GET /v1/my-category/{}\n```\n\nThis means a route exists in `routes/*.rs` but has no matching `#[utoipa::path]` annotation (or isn\'t registered in `openapi.rs`). The reverse case — a path in the spec with no registered route — is also caught.\n\n## Checklist\n\n- [ ] `#[utoipa::path(...)]` added above the handler function\n- [ ] Module is `pub mod` (not private `mod`) in parent `mod.rs`\n- [ ] Full submodule path added to `paths(...)` in `openapi.rs`\n- [ ] `path =` matches the actual route registered in `routes/*.rs`\n- [ ] `tag =` uses an existing tag (or you added a new one)\n- [ ] `cargo build --package polkadot-rest-api` compiles\n- [ ] Swagger UI at `/docs` shows the new endpoint\n\n## Architecture notes\n\n### Why not utoipa-swagger-ui?\n\n`utoipa-swagger-ui` v9 targets axum 0.8. This project uses axum 0.7. Instead, the Swagger UI is served as a static HTML page (`crates/server/src/swagger_ui.html`) that loads Swagger UI from the unpkg CDN (`unpkg.com/swagger-ui-dist@5`). The OpenAPI JSON is served via a plain Axum route.\n\n### Why full submodule paths?\n\n`#[utoipa::path]` generates `__path_` in the handler\'s module. A `pub use handler::fn_name` in `mod.rs` re-exports the function but **not** the generated struct. The `#[derive(OpenApi)]` macro needs the struct, so paths in `openapi.rs` must point to the actual submodule where the struct lives.\n\n### Key files\n\n| File | Purpose |\n|------|---------|\n| `crates/server/src/openapi.rs` | Central `#[derive(OpenApi)]` — registers all paths and tags |\n| `crates/server/src/app.rs` | Mounts `/api-docs/openapi.json` and `/docs` routes |\n| `crates/server/src/swagger_ui.html` | Static Swagger UI page (CDN-based) |\n| `crates/server/Cargo.toml` | `utoipa = { version = "5", features = ["axum_extras"] }` |\n'),"adding-benchmarks":$('# Adding Benchmarks for New Endpoints\n\nQuick guide to add performance benchmarks for new API endpoints.\n\n## 📋 Overview\n\nEach endpoint benchmark consists of:\n- **Directory**: `benchmarks/your_endpoint/`\n- **Runner script**: `init.sh` (configures and runs wrk)\n- **Lua script**: `your_endpoint.lua` (defines HTTP requests)\n- **Configuration**: Entry in `benchmark_config.json`\n\nThe CI automatically discovers and runs all benchmarks.\n\n## 📝 Step-by-Step\n\n### 1. Create the Lua Script\n\nCreate `benchmarks/blocks/blocks.lua`:\n\n```lua\n-- Blocks endpoint benchmark\nrequest = function()\n local block_id = math.random(1000000, 5000000)\n return wrk.format("GET", "/blocks/" .. block_id)\nend\n```\n\n### 2. Create the Runner Script\n\nCreate `benchmarks/blocks/init.sh`:\n\n```bash\n#!/bin/bash\n\nset -e\n\nSCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"\nPROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"\nCONFIG_FILE="$PROJECT_ROOT/benchmark_config.json"\n\nSCENARIO="${1:-light_load}"\nHARDWARE_PROFILE="${2:-ci_runner}"\n\n# Validate hardware profile\nif ! jq -e ".hardware_profiles.\\"$HARDWARE_PROFILE\\"" "$CONFIG_FILE" > /dev/null; then\n echo "Error: Hardware profile \'$HARDWARE_PROFILE\' not found"\n exit 1\nfi\n\n# Get benchmark configuration\nTHREADS=$(jq -r ".benchmarks.blocks.scenarios[] | select(.name == \\"$SCENARIO\\") | .threads" "$CONFIG_FILE")\nCONNECTIONS=$(jq -r ".benchmarks.blocks.scenarios[] | select(.name == \\"$SCENARIO\\") | .connections" "$CONFIG_FILE")\nDURATION=$(jq -r ".benchmarks.blocks.scenarios[] | select(.name == \\"$SCENARIO\\") | .duration" "$CONFIG_FILE")\nTIMEOUT=$(jq -r ".benchmarks.blocks.scenarios[] | select(.name == \\"$SCENARIO\\") | .timeout" "$CONFIG_FILE")\n\nif [ -z "$THREADS" ] || [ "$THREADS" == "null" ]; then\n echo "Error: Scenario \'$SCENARIO\' not found"\n exit 1\nfi\n\nSERVER_HOST=$(jq -r \'.server.host\' "$CONFIG_FILE")\nSERVER_PORT=$(jq -r \'.server.port\' "$CONFIG_FILE")\n\necho "Running blocks endpoint benchmark: $SCENARIO"\necho "Configuration: threads=$THREADS, connections=$CONNECTIONS, duration=$DURATION"\n\n# Run wrk benchmark\ncd "$SCRIPT_DIR"\nwrk -d"$DURATION" -t"$THREADS" -c"$CONNECTIONS" --timeout "${TIMEOUT:-120s}" --latency \\\n -s ./blocks.lua "http://$SERVER_HOST:$SERVER_PORT"\n```\n\n### 3. Add Configuration\n\nAdd your endpoint to `benchmark_config.json`. You can either use standard scenarios or define custom ones:\n\n#### Option 1: Use Standard Scenarios\n\nWhen `use_standard_scenarios` is set to `true`, your endpoint will automatically use the predefined standard scenarios:\n\n```json\n{\n "benchmarks": {\n "blocks": {\n "endpoint": "/blocks/:block_id",\n "use_standard_scenarios": true\n }\n }\n}\n```\n\nThis will use the following standard scenarios defined in `benchmark_config.json`:\n\n```json\n{\n "standard_scenarios": [\n {\n "name": "light_load",\n "description": "Light load testing - suitable for development and CI",\n "threads": 2,\n "connections": 10,\n "duration": "30s",\n "timeout": "60s"\n },\n {\n "name": "medium_load",\n "description": "Medium load testing - balanced performance test",\n "threads": 4,\n "connections": 50,\n "duration": "60s",\n "timeout": "120s"\n },\n {\n "name": "heavy_load",\n "description": "Heavy load testing - high performance test",\n "threads": 8,\n "connections": 100,\n "duration": "120s",\n "timeout": "180s"\n },\n {\n "name": "stress_test",\n "description": "Stress testing - maximum load test",\n "threads": 12,\n "connections": 200,\n "duration": "300s",\n "timeout": "360s"\n }\n ]\n}\n```\n\n#### Option 2: Define Custom Scenarios\n\nWhen you need specific performance parameters for your endpoint, you can define custom scenarios. Set `use_standard_scenarios` to `false` and provide your own `custom_scenarios` array:\n\n```json\n{\n "benchmarks": {\n "your_endpoint": {\n "endpoint": "/your/endpoint/path",\n "use_standard_scenarios": false,\n "custom_scenarios": [\n {\n "name": "scenario_name",\n "description": "Description of this scenario",\n "threads": ,\n "connections": ,\n "duration": "s",\n "timeout": "s"\n }\n ]\n }\n }\n}\n```\n\nEach custom scenario must include:\n- **`name`**: Unique identifier for the scenario (e.g., "light_load", "medium_load")\n- **`description`**: Human-readable description of what this scenario tests\n- **`threads`**: Number of threads to use in wrk\n- **`connections`**: Number of concurrent connections to maintain\n- **`duration`**: How long to run the test (e.g., "30s", "60s", "120s")\n- **`timeout`**: Request timeout (e.g., "60s", "120s", "180s")\n\n**Note**: The benchmark scripts will first check for custom scenarios, then fall back to standard scenarios if not found. This allows you to override specific scenarios while keeping others standard.\n'),migration:$('# Migration Guide\n\n\n## Substrate API Sidecar v20.14.0 to Polkadot REST API\nThis guide documents breaking changes and differences between [substrate-api-sidecar](https://github.com/paritytech/substrate-api-sidecar) and this new Rust-based Polkadot REST API implementation.\n\n## Overview\n\nThis project is a Rust-based alternative to substrate-api-sidecar, designed to provide improved performance, memory safety, and better resource utilization. While we aim to maintain API compatibility where possible, some breaking changes are necessary for architectural improvements.\n\n## Public Instances\n\nParity hosts public instances of the Polkadot REST API for the following chains:\n\n| Chain | URL |\n|-------|-----|\n| **Polkadot** | https://polkadot-relay-rest-api.parity.io/v1 |\n| **Kusama** | https://kusama-relay-rest-api.parity.io/v1 |\n| **Westend** | https://westend-relay-rest-api.parity.io/v1 |\n| **Polkadot Asset Hub** | https://polkadot-hub-rest-api.parity.io/v1 |\n| **Kusama Asset Hub** | https://kusama-hub-rest-api.parity.io/v1 |\n| **Westend Asset Hub** | https://westend-hub-rest-api.parity.io/v1 |\n\nInteractive API documentation is available at `/docs` on each instance (e.g., [Polkadot Docs](https://polkadot-relay-rest-api.parity.io/docs)).\n\n**Usage Limits & Production Warning**\n\nThese public instances are subject to rate limiting and are not intended for production use. For consistent testing or development, it is highly recommended to implement a retry strategy (e.g., exponential backoff) to handle potential request throttling gracefully.\n\n---\n\n## ⚠️ Breaking Changes ⚠️\n\n### URL prefix\n\nAll API endpoints are now versioned under the `/v1` prefix.\n\n| Sidecar | Polkadot REST API |\n|---------|-------------------|\n| `GET /blocks/head` | `GET /v1/blocks/head` |\n| `GET /accounts/{id}/balance-info` | `GET /v1/accounts/{id}/balance-info` |\n| `POST /transaction` | `POST /v1/transaction` |\n\nUpdate all client URLs by prepending `/v1` to existing paths.\n\n### Coretime endpoint changes\n\n- **Renamed field**: `palletVersion` → `storageVersion` in `coretime/info`, to match current naming. See [commit](https://github.com/paritytech/polkadot-sdk/commit/4fe55f0bcb8edccaad73b33b804c349a756f7d3c).\n- **Renamed field**: `type` → `lifecycle` in `coretime/overview`, to match the on-chain type (`ParaLifecycle` enum, `ParaLifecycles` storage, `fn lifecycle()` accessor).\n- **Numeric fields**: All u16 and u32 fields are now returned as numbers instead of strings. This is an intentional divergence to provide more accurate JSON types, while maintaining safety for large values (u128 is still returned as a string).\n- **HTTP status codes**: Error responses (e.g., pallet missing at a requested block) now return 400 or 404 instead of 500.\n- **Price fix**: `/v1/coretime/info` — The `currentCorePrice` calculation has been corrected. The previous calculation was faulty. See [PR #175](https://github.com/paritytech/polkadot-rest-api/pull/175).\n- **Removed field**: The field `paraId` was removed from the response of `/v1/coretime/overview`. See [PR #251](https://github.com/paritytech/polkadot-rest-api/pull/251).\n\n### Query parameter changes\n\n| Parameter | Sidecar | Polkadot REST API | Notes |\n|-----------|---------|-------------------|-------|\n| `useRcBlockFormat` | Supported (`array` or `object`) | Use `format=object` instead | Sidecar\'s `useRcBlockFormat=object` is equivalent to `format=object` combined with `useRcBlock=true`. Sidecar\'s `useRcBlockFormat=array` (or omitting the parameter) is the default behavior — no extra parameter needed. |\n\n### Asset balance endpoints no longer return zero balances by default\n\nThe following endpoints now **exclude assets with zero balance** by default:\n\n- `GET /v1/accounts/{accountId}/asset-balances`\n- `GET /v1/accounts/{accountId}/pool-asset-balances`\n- `GET /v1/accounts/{accountId}/foreign-asset-balances`\n\nTo include zero-balance assets (previous behavior), use the `showEmpty=true` query parameter:\n\n```\nGET /v1/accounts/{accountId}/asset-balances?showEmpty=true\nGET /v1/accounts/{accountId}/pool-asset-balances?showEmpty=true\nGET /v1/accounts/{accountId}/foreign-asset-balances?showEmpty=true\n```\n\nThis change improves performance by reducing response payload size for accounts with many registered assets but few actual holdings.\n\n**Migration example:**\n\n```\n# Sidecar — object format\nGET /blocks/12345?useRcBlock=true&useRcBlockFormat=object\n\n# Polkadot REST API — equivalent\nGET /v1/blocks/12345?useRcBlock=true&format=object\n```\n\nBoth produce the same response structure:\n\n```json\n{\n "rcBlock": {\n "hash": "0x...",\n "parentHash": "0x...",\n "number": "12345"\n },\n "parachainDataPerBlock": [\n { /* Asset Hub block data with rcBlockHash, rcBlockNumber, ahTimestamp */ }\n ]\n}\n```\n\n```\n# Sidecar — array format (default)\nGET /blocks/12345?useRcBlock=true\n\n# Polkadot REST API — equivalent (same, no extra parameter)\nGET /v1/blocks/12345?useRcBlock=true\n```\n\nBoth return an array of Asset Hub blocks (or `[]` if none found).\n\n---\n\n### Response Differences\n\n#### Pallet metadata `args` field — simplified type names\n\nThe `args` field in pallet metadata responses (e.g., `/v1/pallets/{palletId}/events`, `/v1/pallets/{palletId}/errors`) returns **simplified type names** instead of fully expanded type definitions. This applies to any endpoint that exposes type arguments for pallet items.\n\n#### Example Responses\n\n**Polkadot REST API:**\n```json\n{\n "args": ["DispatchInfo"]\n}\n```\n```json\n{\n "args": ["DispatchError", "DispatchInfo"]\n}\n```\n\n**Sidecar (expanded definitions):**\n```json\n{\n "args": ["{\\"weight\\":\\"SpWeightsWeightV2Weight\\",\\"class\\":\\"FrameSupportDispatchDispatchClass\\",\\"paysFee\\":\\"FrameSupportDispatchPays\\"}"]\n}\n```\n```json\n{\n "args": [\n "{\\"_enum\\":{\\"Other\\":\\"Null\\",\\"CannotLookup\\":\\"Null\\",\\"BadOrigin\\":\\"Null\\",\\"Module\\":\\"SpRuntimeModuleError\\",...}}",\n "{\\"weight\\":\\"SpWeightsWeightV2Weight\\",\\"class\\":\\"FrameSupportDispatchDispatchClass\\",\\"paysFee\\":\\"FrameSupportDispatchPays\\"}"\n ]\n}\n```\n\n**This is an intentional difference.** Resolving types to the fully expanded Polkadot.js-style structure introduces significant complexity and fragility for minimal benefit. The simplified type names are the canonical names from the runtime metadata and are sufficient to identify the type. Consumers needing the full type definition can look it up from the runtime metadata directly.\n\n---\n\n## Fixes\n\n### Historical data with `?at=`\n\nThe following endpoints now return historical data when using the `?at=` query parameter. Sidecar\'s implementation returned current state regardless of the `at` parameter:\n - `/v1/pallets/assets/{assetId}/asset-info`\n - `/v1/pallets/asset-conversion/liquidity-pools`\n - `/v1/pallets/asset-conversion/next-available-id`\n - `/v1/pallets/pool-assets/{assetId}/asset-info`\n - `/v1/pallets/foreign-assets`\n\n---\n\n## Endpoints not available in Polkadot REST API\n\nThe following sidecar endpoints do **not** have equivalents in this project:\n\n### Experimental / trace endpoints\n\n| Sidecar endpoint | Status |\n|------------------|--------|\n| `GET /experimental/blocks/head/traces` | Not implemented |\n| `GET /experimental/blocks/{blockId}/traces` | Not implemented |\n| `GET /experimental/blocks/head/traces/operations` | Not implemented |\n| `GET /experimental/blocks/{blockId}/traces/operations` | Not implemented |\n| `GET /experimental/rc/blocks/head/traces` | Not implemented |\n| `GET /experimental/rc/blocks/{blockId}/traces` | Not implemented |\n| `GET /experimental/rc/blocks/head/traces/operations` | Not implemented |\n| `GET /experimental/rc/blocks/{blockId}/traces/operations` | Not implemented |\n\n### Ink! contracts\n\n| Sidecar endpoint | Status |\n|------------------|--------|\n| `POST /contracts/ink/{address}/query` | Not implemented |\n\n### Parachain endpoints\n\nMost parachain-specific endpoints from sidecar are not implemented. Only parachain head inclusion is available:\n\n| Sidecar endpoint | Polkadot REST API | Status |\n|------------------|-------------------|--------|\n| `GET /paras` | — | Not implemented |\n| `GET /paras/{paraId}/crowdloan-info` | — | Not implemented (crowdloans deprecated) |\n| `GET /paras/{paraId}/lease-info` | — | Not implemented |\n| `GET /paras/auctions/current` | — | Not implemented (auctions deprecated) |\n| `GET /paras/crowdloans` | — | Not implemented (crowdloans deprecated) |\n| `GET /paras/head/backed-candidates` | — | Not implemented |\n| `GET /paras/head/included-candidates` | — | Not implemented |\n| `GET /paras/leases/current` | — | Not implemented |\n| `GET /paras/{paraId}/head-inclusions` | `GET /v1/paras/{paraId}/head-inclusions` | Available |\n\n> **Note:** Crowdloan and auction endpoints are deprecated on-chain (crowdloans have been superseded by Coretime). These are intentionally not ported.\n\n---\n\n## New endpoints (not in Sidecar)\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET /v1/version` | Returns the running Polkadot REST API version |\n| `GET /v1/capabilities` | Returns supported pallets, chain type, and SS58 prefix |\n| `GET /api-docs/openapi.json` | Auto-generated OpenAPI 3.0 spec |\n| `GET /docs/` | Interactive documentation UI |\n\n---\n\n## Configuration changes\n\nBoth projects use environment variables with the `SAS_` prefix. Most variables are compatible.\n\n### Supported in both\n\n| Variable | Default | Purpose |\n|----------|---------|---------|\n| `SAS_SUBSTRATE_URL` | `ws://127.0.0.1:9944` | Primary RPC endpoint |\n| `SAS_EXPRESS_PORT` | `8080` | HTTP server port |\n| `SAS_EXPRESS_BIND_HOST` | `127.0.0.1` | Bind address |\n| `SAS_EXPRESS_KEEP_ALIVE_TIMEOUT` | `5000` | Keep-alive timeout (ms) |\n| `SAS_LOG_LEVEL` | `info` | Log level |\n| `SAS_LOG_JSON` | `false` | JSON log output |\n| `SAS_LOG_STRIP_ANSI` | `false` | Strip ANSI codes |\n| `SAS_LOG_WRITE` | `false` | Write logs to file |\n| `SAS_LOG_WRITE_PATH` | `./logs` | Log file directory |\n| `SAS_LOG_WRITE_MAX_FILE_SIZE` | `5242880` | Max log file size |\n| `SAS_LOG_WRITE_MAX_FILES` | `5` | Max number of log files |\n| `SAS_METRICS_ENABLED` | `false` | Enable Prometheus metrics |\n| `SAS_METRICS_PROM_HOST` | `127.0.0.1` | Prometheus host |\n| `SAS_METRICS_PROM_PORT` | `9100` | Prometheus port |\n| `SAS_METRICS_LOKI_HOST` | `127.0.0.1` | Loki host |\n| `SAS_METRICS_LOKI_PORT` | `3100` | Loki port |\n| `SAS_METRICS_INCLUDE_QUERYPARAMS` | `false` | Include query params in metric labels |\n| `SAS_SUBSTRATE_MULTI_CHAIN_URL` | — | JSON array for relay chain connection |\n\n### New in Polkadot REST API\n\n| Variable | Default | Purpose |\n|----------|---------|---------|\n| `SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY` | `10` | Concurrent block fetches |\n| `SAS_EXPRESS_REQUEST_LIMIT` | `512000` | Max request body size (bytes) |\n| `SAS_SUBSTRATE_RECONNECT_INITIAL_DELAY_MS` | `100` | RPC reconnect initial delay |\n| `SAS_SUBSTRATE_RECONNECT_MAX_DELAY_MS` | `10000` | RPC reconnect max delay |\n| `SAS_SUBSTRATE_RECONNECT_REQUEST_TIMEOUT_MS` | `30000` | RPC request timeout |\n| `SAS_METRICS_PROMETHEUS_PREFIX` | `polkadot_rest_api` | Prometheus metric prefix |\n\n### Sidecar-only (not supported)\n\n| Variable | Purpose | Notes |\n|----------|---------|-------|\n| `SAS_SUBSTRATE_TYPES_BUNDLE` | Custom typesBundle | Not needed — subxt handles type resolution |\n| `SAS_SUBSTRATE_TYPES_CHAIN` | Custom typesChain | Not needed |\n| `SAS_SUBSTRATE_TYPES_SPEC` | Custom typesSpec | Not needed |\n| `SAS_SUBSTRATE_TYPES` | Custom types | Not needed |\n| `SAS_SUBSTRATE_CACHE_CAPACITY` | LRU cache size | Not implemented — uses different caching strategy |\n| `SAS_EXPRESS_INJECTED_CONTROLLERS` | Pallet-injected controllers | Not supported |\n| `SAS_EXPRESS_MAX_BODY` | Max body size | Replaced by `SAS_EXPRESS_REQUEST_LIMIT` |\n| `SAS_LOG_FILTER_RPC` | Filter API-WS RPC logging | Not implemented |\n\n---\n\n## Installation changes\n\n| | Sidecar | Polkadot REST API |\n|---|---------|-------------------|\n| **Runtime** | Node.js (v18+) | Rust binary (no runtime needed) |\n| **Install** | `npm install @substrate/api-sidecar` | `cargo install polkadot-rest-api` |\n| **Start** | `substrate-api-sidecar` | `polkadot-rest-api` |\n| **Docker** | `docker-compose up` | `docker-compose up` |\n\n---\n\n## Docker changes\n\nBoth projects provide a `Dockerfile` and `docker-compose.yml`. The compose stacks are similar (Polkadot node + API + Loki + Prometheus + Grafana + cAdvisor), but there are key differences.\n\n### Image details\n\n| | Sidecar | Polkadot REST API |\n|---|---------|-------------------|\n| **Base image (build)** | `node:18.12.1-alpine` | `rust:1.90.0-slim-bookworm` |\n| **Base image (runtime)** | `node:18.12.1-alpine` | `debian:bookworm-slim` |\n| **Runtime size** | Includes full Node.js runtime + `node_modules` | Static binary (~single executable) + `ca-certificates` |\n| **Docker Hub** | `parity/substrate-api-sidecar` | `parity/polkadot-rest-api` |\n| **Build command** | `yarn build:docker` | `docker build .` |\n| **Run user** | `node` | `nobody` |\n| **Default env vars** | `SAS_EXPRESS_PORT=8080`, `SAS_EXPRESS_BIND_HOST=0.0.0.0` | `SAS_EXPRESS_PORT=8080`, `SAS_EXPRESS_BIND_HOST=0.0.0.0`, `RUST_LOG=info` |\n\n### Docker run\n\n```bash\n# Sidecar\ndocker pull docker.io/parity/substrate-api-sidecar:latest\ndocker run --rm -it --read-only -p 8080:8080 substrate-api-sidecar\n\n# Polkadot REST API\ndocker pull docker.io/parity/polkadot-rest-api:latest\ndocker run --rm -it --read-only -p 8080:8080 polkadot-rest-api\n```\n\nBoth images support the `--read-only` flag and accept environment variables via `-e` or `--env-file`.\n\n### docker-compose.yml differences\n\nBoth compose files include the same services: `polkadot` node, API server, `loki`, `cadvisor`, `prometheus`, and `grafana`. Key differences:\n\n| | Sidecar | Polkadot REST API |\n|---|---------|-------------------|\n| **API service name** | `sidecar` | `rest-api` |\n| **Exposed ports** | `8080:8080`, `9100:9100` | `8080:8080` |\n| **Bind host config** | Set via env var `SAS_EXPRESS_BIND_HOST: "0.0.0.0"` | Set in Dockerfile default (`0.0.0.0`) |\n| **Prometheus metrics host** | Set via env var `SAS_METRICS_PROM_HOST: "0.0.0.0"` | Not set (uses default `127.0.0.1`) |\n\n### Migration steps for Docker users\n\n1. **Update image name**: Replace `parity/substrate-api-sidecar` with `parity/polkadot-rest-api`\n2. **Update service name** (if referenced): `sidecar` → `rest-api` (or your preferred name)\n3. **Remove `SAS_EXPRESS_BIND_HOST`** from environment if set to `0.0.0.0` — this is now the Dockerfile default\n4. **Update health checks**: Change `curl http://localhost:8080/blocks/head` to `curl http://localhost:8080/v1/blocks/head` (note the `/v1` prefix)\n5. **Remove unused env vars**: `SAS_SUBSTRATE_TYPES_*`, `SAS_SUBSTRATE_CACHE_CAPACITY`, `SAS_EXPRESS_INJECTED_CONTROLLERS` are not supported\n6. **Prometheus port**: Sidecar exposed port `9100` for Prometheus metrics. Polkadot REST API serves metrics on the main port at `/metrics` — update your Prometheus scrape config accordingly\n\n---\n\n## API Changes\n\n- `/v1/version` - Now users can query the currently running version of Polkadot REST API\n')};function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function Y(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,o,i,s=[],c=!0,l=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;c=!1}else for(;!(c=(r=o.call(t)).done)&&(s.push(r.value),s.length!==n);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(l)throw a}}return s}}(e,n)||function(e,n){if(e){if("string"==typeof e)return K(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?K(e,n):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function K(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t3?(a=h===r)&&(c=o[(s=o[4])?5:(s=3,3)],o[4]=o[5]=e):o[0]<=m&&((a=t<2&&mr||r>h)&&(o[4]=t,o[5]=r,u.n=h,s=0))}if(a||t>1)return i;throw p=!0,r}return function(a,d,h){if(l>1)throw TypeError("Generator is already running");for(p&&1===d&&m(d,h),s=d,c=h;(n=s<2?e:c)||!p;){o||(s?s<3?(s>1&&(u.n=-1),m(s,c)):u.n=c:u.v=c);try{if(l=2,o){if(s||(a="next"),n=o[a]){if(!(n=n.call(o,c)))throw TypeError("iterator result is not an object");if(!n.done)return n;c=n.value,s<2&&(s=0)}else 1===s&&(n=o.return)&&n.call(o),s<2&&(c=TypeError("The iterator does not provide a '"+a+"' method"),s=1);o=e}else if((n=(p=u.n<0)?c:t.call(r,u))!==i)break}catch(n){o=e,s=1,c=n}finally{l=1}}return{value:n,done:p}}}(t,a,o),!0),l}var i={};function s(){}function c(){}function l(){}n=Object.getPrototypeOf;var d=[][r]?n(n([][r]())):(Q(n={},r,function(){return this}),n),p=l.prototype=s.prototype=Object.create(d);function u(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,Q(e,a,"GeneratorFunction")),e.prototype=Object.create(p),e}return c.prototype=l,Q(p,"constructor",l),Q(l,"constructor",c),c.displayName="GeneratorFunction",Q(l,a,"GeneratorFunction"),Q(p),Q(p,a,"Generator"),Q(p,r,function(){return this}),Q(p,"toString",function(){return"[object Generator]"}),(J=function(){return{w:o,m:u}})()}function Q(e,n,t,r){var a=Object.defineProperty;try{a({},"",{})}catch(e){a=0}Q=function(e,n,t,r){function o(n,t){Q(e,n,function(e){return this._invoke(n,t,e)})}n?a?a(e,n,{value:t,enumerable:!r,configurable:!r,writable:!r}):e[n]=t:(o("next",0),o("throw",1),o("return",2))},Q(e,n,t,r)}function Z(e,n,t,r,a,o,i){try{var s=e[o](i),c=s.value}catch(e){return void t(e)}s.done?n(c):Promise.resolve(c).then(r,a)}function ee(e){return function(){var n=this,t=arguments;return new Promise(function(r,a){var o=e.apply(n,t);function i(e){Z(o,r,a,i,s,"next",e)}function s(e){Z(o,r,a,i,s,"throw",e)}i(void 0)})}}function ne(e,n){for(var t=0;t1))try{var r=this.getSpecContentKey(e),a=W[r];if(!a)throw new Error("Specification content not found for: ".concat(e));t&&(t.innerHTML=a,this.setupCodeCopyButtons(t))}catch(n){console.error("Error loading specification content:",n),t&&(t.innerHTML='\n
    \n
    \n Error Loading Specification: Could not load the "'.concat(this.getSpecDisplayName(e),'" specification content.\n
    \n
    \n '))}}},{key:"getSpecContentKey",value:function(e){return{useRcBlock:"useRcBlock-spec"}[e]||e}},{key:"getSpecDisplayName",value:function(e){return{useRcBlock:"useRcBlock Specification"}[e]||e.replace(/-/g," ").replace(/\b\w/g,function(e){return e.toUpperCase()})}},{key:"loadGuideContent",value:function(e,n){var t=n.querySelector(".guide-content");if(!(t&&t.children.length>1))try{var r=W[e];if(!r)throw new Error("Guide content not found for: ".concat(e));t&&(t.innerHTML=r,this.setupCodeCopyButtons(t))}catch(n){console.error("Error loading guide content:",n),t&&(t.innerHTML='\n
    \n
    \n Error Loading Guide: Could not load the "'.concat(this.getGuideDisplayName(e),'" guide content.\n
    \n
    \n '))}}},{key:"setupCodeCopyButtons",value:function(e){e.querySelectorAll(".copy-button[data-copy]").forEach(function(e){e.addEventListener("click",function(n){n.preventDefault();var t=e.dataset.copy;navigator.clipboard&&navigator.clipboard.writeText(t).then(function(){var n=e.innerHTML;e.innerHTML='',setTimeout(function(){e.innerHTML=n},1e3)})})})}},{key:"getGuideDisplayName",value:function(e){return{"asset-hub-migration":"Asset Hub Migration","useRcBlock-spec":"useRcBlock Specification"}[e]||e.replace(/-/g," ").replace(/\b\w/g,function(e){return e.toUpperCase()})}},{key:"setupSearch",value:function(){var e,n=this,t=document.getElementById("search-input"),r=document.getElementById("search-clear"),a=document.getElementById("search-results");t&&this.searchHandler&&(t.addEventListener("input",function(t){var a=t.target.value.trim();r.style.display=a?"flex":"none",clearTimeout(e),e=setTimeout(function(){n.performSearch(a)},300)}),r.addEventListener("click",function(){t.value="",r.style.display="none",n.clearSearch()}),a.addEventListener("click",function(e){if(e.target.matches("[data-search-endpoint]")){e.preventDefault();var r=e.target.dataset.searchEndpoint;n.navigateToEndpoint(r),n.clearSearch(),t.blur()}else if(e.target.matches("[data-search-schema]")){e.preventDefault();var a=e.target.dataset.searchSchema;n.navigateToSchema(a),n.clearSearch(),t.blur()}}),t.addEventListener("keydown",function(e){"Escape"===e.key&&(n.clearSearch(),t.blur())}),document.addEventListener("click",function(e){e.target.closest(".search-container")||(a.style.display="none")}))}},{key:"setupServerSelection",value:function(){var e=this,n=document.getElementById("server-select");if(n){var t=this.parser.getServers();n.innerHTML="",t.forEach(function(e,t){var r=document.createElement("option");r.value=t,r.textContent=e.description||e.url,"http://localhost:8080"===e.url&&(r.selected=!0),n.appendChild(r)}),n.addEventListener("change",function(n){var r=parseInt(n.target.value),a=t[r];a&&(e.currentServer=a.url,e.updateExampleRequests())})}}},{key:"setupThemeToggle",value:function(){var e=document.getElementById("theme-toggle");if(e){var n=localStorage.getItem("theme")||"dark";document.documentElement.setAttribute("data-theme",n),e.addEventListener("click",function(){var e="dark"===document.documentElement.getAttribute("data-theme")?"light":"dark";document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e)})}}},{key:"setupMobileMenu",value:function(){var e=document.getElementById("menu-toggle"),n=document.getElementById("sidebar");e&&n&&(e.addEventListener("click",function(){n.classList.toggle("mobile-open"),e.classList.toggle("active")}),document.addEventListener("click",function(t){n.contains(t.target)||e.contains(t.target)||(n.classList.remove("mobile-open"),e.classList.remove("active"))}))}},{key:"setupCopyToClipboard",value:function(){var e=this;document.addEventListener("click",function(){var n=ee(J().m(function n(t){var r,a,o;return J().w(function(n){for(;;)switch(n.p=n.n){case 0:if(!t.target.matches(".copy-button")&&!t.target.closest(".copy-button")){n.n=4;break}if(t.preventDefault(),r=t.target.matches(".copy-button")?t.target:t.target.closest(".copy-button"),a=r.dataset.copy){n.n=1;break}return n.a(2);case 1:return n.p=1,n.n=2,navigator.clipboard.writeText(a);case 2:e.showCopyFeedback(r),n.n=4;break;case 3:n.p=3,o=n.v,console.error("Failed to copy text:",o),e.fallbackCopy(a,r);case 4:return n.a(2)}},n,null,[[1,3]])}));return function(e){return n.apply(this,arguments)}}())}},{key:"setupScrollSpy",value:function(){var e=new IntersectionObserver(function(e){e.forEach(function(e){var n=e.target.id,t=document.querySelector('[href="#'.concat(n,'"]'));t&&e.isIntersecting&&(document.querySelectorAll(".nav-link.active").forEach(function(e){e.classList.remove("active")}),t.classList.add("active"))})},{root:null,rootMargin:"-10% 0px -80% 0px",threshold:0});document.querySelectorAll(".content-section").forEach(function(n){e.observe(n)})}},{key:"setupCollapsibleSections",value:function(){document.addEventListener("click",function(e){if(e.target.matches(".section-toggle")||e.target.closest(".section-toggle")){e.preventDefault(),e.stopPropagation();var n=e.target.matches(".section-toggle")?e.target:e.target.closest(".section-toggle"),t=n.dataset.target,r=document.getElementById(t);r&&(r.classList.toggle("collapsed"),n.classList.toggle("collapsed"))}if(e.target.matches(".nav-section-header")||e.target.closest(".nav-section-header")){var a=(e.target.matches(".nav-section-header")?e.target:e.target.closest(".nav-section-header")).querySelector(".section-toggle");if(a){var o=a.dataset.target,i=document.getElementById(o);i&&(i.classList.toggle("collapsed"),a.classList.toggle("collapsed"))}}})}},{key:"setupCurlGenerator",value:function(){var e=this;document.addEventListener("click",function(n){if(n.target.matches(".generate-curl-btn")||n.target.closest(".generate-curl-btn")){n.preventDefault();var t=(n.target.matches(".generate-curl-btn")?n.target:n.target.closest(".generate-curl-btn")).dataset.endpointId;e.generateCurlCommand(t)}}),document.addEventListener("click",function(){var n=ee(J().m(function n(t){var r,a,o;return J().w(function(n){for(;;)switch(n.p=n.n){case 0:if(!t.target.id||!t.target.id.startsWith("copy-curl-")){n.n=4;break}if(t.preventDefault(),r=t.target.id.replace("copy-curl-",""),!(a=document.getElementById("curl-command-".concat(r)))||!a.textContent){n.n=4;break}return n.p=1,n.n=2,navigator.clipboard.writeText(a.textContent);case 2:e.showCopyFeedback(t.target),n.n=4;break;case 3:n.p=3,o=n.v,console.error("Failed to copy:",o);case 4:return n.a(2)}},n,null,[[1,3]])}));return function(e){return n.apply(this,arguments)}}())}},{key:"setupSendRequest",value:function(){var e=this;document.addEventListener("click",function(){var n=ee(J().m(function n(t){var r,a,o,i,s,c,l,d,p,u,m,h,g,f,v,y,b;return J().w(function(n){for(;;)switch(n.p=n.n){case 0:if(!t.target.matches(".send-request-btn")&&!t.target.closest(".send-request-btn")){n.n=11;break}if(t.preventDefault(),r=t.target.matches(".send-request-btn")?t.target:t.target.closest(".send-request-btn"),a=r.dataset.endpointId,o=e.parser.getEndpoint(a)){n.n=1;break}return n.a(2);case 1:if(i=document.querySelectorAll('[data-endpoint-id="'.concat(a,'"] .param-input')),s=!1,i.forEach(function(e){var n=e.hasAttribute("required"),t=e.value.trim();n&&!t?(s=!0,e.classList.add("error")):e.classList.remove("error")}),!s){n.n=2;break}return e.showParameterError(a,"Please fill in all required parameters"),n.a(2);case 2:return c=e.buildApiExplorerRequestConfig(o,a),r.disabled=!0,r.textContent="Sending...",l=document.getElementById("response-output-".concat(a)),d=document.getElementById("response-status-".concat(a)),p=document.getElementById("response-time-".concat(a)),u=document.getElementById("response-body-".concat(a)),n.p=3,m=Date.now(),n.n=4,fetch(c.url,{method:c.options.method,headers:c.options.headers,body:c.options.body});case 4:if(h=n.v,g=Date.now()-m,!(h.headers.get("content-type")||"").includes("application/json")){n.n=6;break}return y=JSON,n.n=5,h.json();case 5:f=y.stringify.call(y,n.v,null,2),n.n=8;break;case 6:return n.n=7,h.text();case 7:f=n.v;case 8:l&&(l.style.display="block"),d&&(d.textContent="".concat(h.status," ").concat(h.statusText),d.className="response-status ".concat(h.ok?"status-success":"status-error")),p&&(p.textContent="".concat(g,"ms")),u&&(u.textContent=f),(v=document.getElementById("copy-response-".concat(a)))&&(v.onclick=ee(J().m(function n(){var t;return J().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,n.n=1,navigator.clipboard.writeText(f);case 1:e.showCopyFeedback(v),n.n=3;break;case 2:n.p=2,t=n.v,console.error("Copy failed:",t);case 3:return n.a(2)}},n,null,[[0,2]])}))),n.n=10;break;case 9:n.p=9,b=n.v,l&&(l.style.display="block"),d&&(d.textContent="Error",d.className="response-status status-error"),p&&(p.textContent=""),u&&(u.textContent=b.message);case 10:return n.p=10,r.disabled=!1,r.textContent="Send Request",n.f(10);case 11:return n.a(2)}},n,null,[[3,9,10,11]])}));return function(e){return n.apply(this,arguments)}}())}},{key:"setupApiExplorerListeners",value:function(){var e=this;document.addEventListener("input",function(n){if(n.target.matches(".param-input")||n.target.matches(".json-input")){var t=n.target.dataset.endpoint;t&&e.updateApiExplorerPreview(t)}})}},{key:"updateApiExplorerPreview",value:function(e){var n=this.parser.getEndpoint(e);if(n){var t=this.buildApiExplorerRequestConfig(n,e),r=document.getElementById("curl-preview-".concat(e));r&&(r.textContent=this.generateCurl(t))}}},{key:"buildApiExplorerRequestConfig",value:function(e,n){var t=this.currentServer+e.path,r={method:e.method,headers:{"Content-Type":"application/json"}},a=new URLSearchParams,o={},i=document.querySelector('.parameter-inputs[data-endpoint-id="'.concat(n,'"]'));(i?i.querySelectorAll(".param-input"):[]).forEach(function(e){var n=e.dataset.paramName,t=e.value.trim(),i=e.dataset.paramLocation;if(t)switch(i){case"path":o[n]=t;break;case"query":a.append(n,t);break;case"header":r.headers[n]=t}}),Object.entries(o).forEach(function(e){var n=Y(e,2),r=n[0],a=n[1];t=t.replace("{".concat(r,"}"),encodeURIComponent(a))});var s=a.toString();s&&(t+=(t.includes("?")?"&":"?")+s);var c=document.getElementById("request-body-".concat(n));if(c&&c.value.trim())try{r.body=JSON.stringify(JSON.parse(c.value))}catch(e){r.body=c.value}return{url:t,options:r}}},{key:"generateCurl",value:function(e){var n="curl -X ".concat(e.options.method,' "').concat(e.url,'"');return Object.entries(e.options.headers||{}).forEach(function(e){var t=Y(e,2),r=t[0],a=t[1];n+=' \\\n -H "'.concat(r,": ").concat(a,'"')}),e.options.body&&(n+=" \\\n -d '".concat(e.options.body,"'")),n}},{key:"generateCurlCommand",value:function(e){var n=this.parser.getEndpoint(e);if(n){var t=document.querySelectorAll('[data-endpoint-id="'.concat(e,'"] .param-input')),r={},a=!1;if(t.forEach(function(e){var n=e.dataset.paramName,t=e.dataset.paramLocation,o=e.value.trim();e.hasAttribute("required")&&!o?(a=!0,e.classList.add("error")):e.classList.remove("error"),o&&(r[t]||(r[t]={}),r[t][n]=o)}),a)this.showParameterError(e,"Please fill in all required parameters");else{var o=this.currentServer+n.path,i=n.method.toUpperCase();if(r.path&&Object.entries(r.path).forEach(function(e){var n=Y(e,2),t=n[0],r=n[1];o=o.replace("{".concat(t,"}"),encodeURIComponent(r))}),r.query&&Object.keys(r.query).length>0){var s=Object.entries(r.query).map(function(e){var n=Y(e,2),t=n[0],r=n[1];return"".concat(encodeURIComponent(t),"=").concat(encodeURIComponent(r))}).join("&");o+="?".concat(s)}var c="curl -X ".concat(i);"GET"!==i&&(c+=' -H "Content-Type: application/json"'),!n.requestBody||"POST"!==i&&"PUT"!==i&&"PATCH"!==i||(c+=' \\\n -d \'{"example": "data"}\' \\'),c+=' \\\n "'.concat(o,'"'),this.displayGeneratedCurl(e,c)}}}},{key:"displayGeneratedCurl",value:function(e,n){var t=document.getElementById("curl-output-".concat(e)),r=document.getElementById("curl-command-".concat(e)),a=document.getElementById("copy-curl-".concat(e));t&&r&&(r.textContent=n,t.style.display="block",a&&(a.dataset.copy=n),t.scrollIntoView({behavior:"smooth",block:"nearest"}))}},{key:"showParameterError",value:function(e,n){var t=document.querySelector('[data-endpoint-id="'.concat(e,'"] .param-error'));t&&t.remove();var r=document.querySelector('[data-endpoint-id="'.concat(e,'"] .generate-curl-section'));if(r){var a=document.createElement("div");a.className="param-error",a.textContent=n,r.insertBefore(a,r.firstChild),setTimeout(function(){a.parentNode&&a.remove()},5e3)}}},{key:"render",value:function(){this.components.renderNavigation(),this.updateApiInfo(),setTimeout(function(){var e=document.getElementById("endpoints-nav"),n=document.querySelector('[data-target="endpoints-nav"]');e&&n&&(e.classList.remove("collapsed"),n.classList.remove("collapsed"))},100)}},{key:"updateApiInfo",value:function(){var e=this.parser.getApiInfo();document.querySelectorAll("#api-version, #version-display").forEach(function(n){n.textContent="v".concat(e.version)}),document.title="".concat(e.title," Documentation")}},{key:"navigateToEndpoint",value:function(e){console.log("Navigating to endpoint:",e);var n=this.parser.getEndpoint(e);if(n)try{var t=this.components.renderEndpoint(n,this.currentServer);this.showContent(t),this.updateBreadcrumb([{name:"API",href:"#overview"},{name:n.tags[0]||"Endpoints",href:"#"},{name:"".concat(n.method," ").concat(n.path),href:"#endpoint-".concat(e)}]),window.scrollTo(0,0),console.log("Successfully navigated to endpoint:",e)}catch(e){console.error("Error navigating to endpoint:",e)}else console.error("Endpoint not found:",e)}},{key:"navigateToSchema",value:function(e){var n=this.parser.getSchema(e);if(n){var t=this.components.renderSchemaPage(n);this.showContent(t),this.updateBreadcrumb([{name:"API",href:"#overview"},{name:"Schemas",href:"#"},{name:e,href:"#schema-".concat(e)}]),window.scrollTo(0,0)}}},{key:"showContent",value:function(e){var n=document.getElementById("dynamic-content"),t=document.getElementById("overview"),r=document.getElementById("getting-started");n&&t&&(t.style.display="none",r&&(r.style.display="none"),n.innerHTML=e,document.querySelectorAll('[id^="guide-"], [id^="spec-"]').forEach(function(e){e.style.display="none"}))}},{key:"showOverview",value:function(){var e=document.getElementById("dynamic-content"),n=document.getElementById("overview"),t=document.getElementById("getting-started");e&&n&&(n.style.display="block",t&&(t.style.display="none"),e.innerHTML="",document.querySelectorAll('[id^="guide-"], [id^="spec-"]').forEach(function(e){e.style.display="none"})),window.scrollTo(0,0),this.hideBreadcrumb()}},{key:"showGettingStarted",value:function(){var e=document.getElementById("dynamic-content"),n=document.getElementById("overview"),t=document.getElementById("getting-started");e&&t&&n&&(n.style.display="none",t.style.display="block",e.innerHTML="",document.querySelectorAll('[id^="guide-"], [id^="spec-"]').forEach(function(e){e.style.display="none"})),window.scrollTo(0,0),this.hideBreadcrumb()}},{key:"performSearch",value:function(e){var n=this.searchHandler.search(e);this.searchHandler.renderResults(n)}},{key:"clearSearch",value:function(){var e=document.getElementById("search-input"),n=document.getElementById("search-clear"),t=document.getElementById("search-results");e&&(e.value=""),n&&(n.style.display="none"),t&&(t.style.display="none")}},{key:"updateBreadcrumb",value:function(e){var n=document.getElementById("breadcrumb"),t=n.querySelector(".breadcrumb-list");t&&(t.innerHTML=e.map(function(n,t){return'\n \n ")}).join(""),n.style.display="block")}},{key:"hideBreadcrumb",value:function(){var e=document.getElementById("breadcrumb");e&&(e.style.display="none")}},{key:"updateExampleRequests",value:function(){var e=this;console.log("Server changed to:",this.currentServer),document.querySelectorAll(".request-url").forEach(function(n){var t=n.dataset.endpoint,r=e.parser.getEndpoint(t);r&&(n.value=e.currentServer+r.path)}),document.querySelectorAll('[id^="curl-preview-"]').forEach(function(e){e.textContent="# Enter parameters to generate request"}),document.querySelectorAll('[id^="curl-command-"]').forEach(function(e){e.textContent=""})}},{key:"showCopyFeedback",value:function(e){var n=e.innerHTML;e.innerHTML="✓",e.classList.add("copied"),setTimeout(function(){e.innerHTML=n,e.classList.remove("copied")},2e3)}},{key:"copyToClipboard",value:(t=ee(J().m(function e(n){var t;return J().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,navigator.clipboard.writeText(n);case 1:e.n=3;break;case 2:e.p=2,t=e.v,console.error("Failed to copy text:",t),this.fallbackCopy(n);case 3:return e.a(2)}},e,this,[[0,2]])})),function(e){return t.apply(this,arguments)})},{key:"fallbackCopy",value:function(e,n){var t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();try{document.execCommand("copy"),this.showCopyFeedback(n)}catch(e){console.error("Fallback copy failed:",e)}document.body.removeChild(t)}},{key:"showLoading",value:function(){var e=document.getElementById("loading-screen"),n=document.getElementById("app");e&&(e.style.display="flex"),n&&(n.style.display="none")}},{key:"hideLoading",value:function(){var e=document.getElementById("loading-screen"),n=document.getElementById("app");e&&(e.style.display="none"),n&&(n.style.display="block")}},{key:"showError",value:function(e){var n=document.getElementById("loading-screen");n&&(n.innerHTML='\n
    \n
    ⚠️
    \n

    '.concat(e,'

    \n \n
    \n '))}}],n&&ne(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t,r}();document.addEventListener("DOMContentLoaded",function(){var e=new re;window.docAppInstance=e,e.init()}),window.addEventListener("hashchange",function(){var e=window.location.hash.slice(1);if(e.startsWith("endpoint-")){var n=e.replace("endpoint-",""),t=window.docAppInstance;t&&t.navigateToEndpoint(n)}else if(e.startsWith("schema-")){var r=e.replace("schema-",""),a=window.docAppInstance;a&&a.navigateToSchema(r)}else if("getting-started"===e){var o=window.docAppInstance;if(o){o.showGettingStarted(),document.querySelectorAll("[data-page]").forEach(function(e){e.classList.remove("active")});var i=document.querySelector('[data-page="getting-started"]');i&&i.classList.add("active")}}else if(e.startsWith("guide-")){var s=e.replace("guide-",""),c=window.docAppInstance;if(c){c.showGuide(s),document.querySelectorAll("[data-guide]").forEach(function(e){e.classList.remove("active")});var l=document.querySelector('[data-guide="'.concat(s,'"]'));l&&l.classList.add("active")}}else if(e.startsWith("spec-")){var d=e.replace("spec-",""),p=window.docAppInstance;if(p){p.showSpecification(d),document.querySelectorAll("[data-spec]").forEach(function(e){e.classList.remove("active")});var u=document.querySelector('[data-spec="'.concat(d,'"]'));u&&u.classList.add("active")}}else if(!e||"overview"===e){var m=window.docAppInstance;if(m){m.showOverview(),document.querySelectorAll("[data-page]").forEach(function(e){e.classList.remove("active")});var h=document.querySelector('[data-page="overview"]');h&&h.classList.add("active")}}}),window.addEventListener("load",function(){var e=window.location.hash.slice(1);e&&"overview"!==e&&setTimeout(function(){console.log("Triggering initial navigation for hash:",e),window.dispatchEvent(new HashChangeEvent("hashchange"))},1e3)}),window.DocApp=re})(); \ No newline at end of file +(()=>{"use strict";var e={365(e,n,t){t.d(n,{A:()=>s});var r=t(601),a=t.n(r),o=t(314),i=t.n(o)()(a());i.push([e.id,"/* Component-specific styles for Polkadot REST API Documentation */\n\n/* Feature Icons - Clean Modern Design */\n.feature-icon {\n width: 48px;\n height: 48px;\n border-radius: var(--radius-lg);\n margin-bottom: var(--spacing-lg);\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.feature-icon::after {\n content: '';\n width: 24px;\n height: 24px;\n border-radius: var(--radius-sm);\n background-color: rgba(255, 255, 255, 0.2);\n}\n\n.account-icon {\n background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);\n}\n\n.block-icon {\n background: linear-gradient(135deg, #10b981 0%, #047857 100%);\n}\n\n.runtime-icon {\n background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);\n}\n\n.transaction-icon {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n}\n\n/* Notice Box Improvements */\n.notice-box {\n padding: var(--spacing-lg);\n border-radius: var(--radius-md);\n border-left: 4px solid var(--accent-primary);\n background-color: rgba(88, 166, 255, 0.1);\n margin: var(--spacing-xl) 0;\n}\n\n.notice-box.info {\n border-left-color: var(--accent-primary);\n background-color: rgba(88, 166, 255, 0.08);\n}\n\n.notice-box .notice-content {\n margin: 0;\n}\n\n/* Navigation Components */\n.nav-menu {\n margin-bottom: var(--spacing-2xl);\n}\n\n.nav-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-md) var(--spacing-xl);\n cursor: pointer;\n transition: background-color var(--transition-fast);\n border-radius: var(--radius-sm);\n margin: 0 var(--spacing-md);\n}\n\n.nav-section-header h3 {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n margin: 0;\n flex: 1;\n}\n\n/* Clean up nav links */\n.nav-link {\n display: flex;\n align-items: center;\n padding: var(--spacing-md) var(--spacing-xl);\n color: var(--text-secondary);\n text-decoration: none;\n border-radius: var(--radius-sm);\n margin: 0 var(--spacing-md) var(--spacing-xs) var(--spacing-md);\n transition: all var(--transition-fast);\n font-weight: var(--font-weight-normal);\n}\n\n.nav-link:hover {\n background-color: var(--bg-hover);\n color: var(--text-primary);\n text-decoration: none;\n}\n\n.nav-link.active {\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n}\n\n.nav-link.active:hover {\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n}\n\n.nav-section {\n margin-bottom: var(--spacing-xl);\n}\n\n/* Improve feature cards */\n.features-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: var(--spacing-xl);\n margin-top: var(--spacing-xl);\n}\n\n.feature-card {\n padding: var(--spacing-2xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n transition: all var(--transition-fast);\n}\n\n.feature-card:hover {\n border-color: var(--accent-primary);\n transform: translateY(-2px);\n box-shadow: var(--shadow-lg);\n}\n\n.feature-card h3 {\n color: var(--text-primary);\n font-weight: var(--font-weight-semibold);\n margin-bottom: var(--spacing-md);\n}\n\n.feature-card p {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin: 0;\n}\n\n/* Improve main content spacing */\n.section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-4xl);\n padding: var(--spacing-2xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n}\n\n.section-header h1 {\n font-size: var(--font-size-4xl);\n font-weight: var(--font-weight-bold);\n color: var(--text-primary);\n margin: 0;\n}\n\n.section-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-lg);\n}\n\n.version-badge {\n display: inline-flex;\n align-items: center;\n padding: var(--spacing-xs) var(--spacing-md);\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-md);\n}\n\n.github-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-md);\n color: var(--text-secondary);\n text-decoration: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n transition: all var(--transition-fast);\n}\n\n.github-link:hover {\n color: var(--text-primary);\n border-color: var(--accent-primary);\n text-decoration: none;\n}\n\n.overview-content {\n max-width: 800px;\n}\n\n.lead {\n font-size: var(--font-size-xl);\n color: var(--text-primary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-3xl);\n}\n\n/* Guide content spacing */\n.guide-content {\n max-width: 800px;\n}\n\n.guide-content h1 {\n font-size: var(--font-size-3xl);\n font-weight: var(--font-weight-bold);\n color: var(--text-primary);\n margin: var(--spacing-4xl) 0 var(--spacing-xl) 0;\n}\n\n.guide-content h1:first-child {\n margin-top: 0;\n}\n\n.guide-content h2 {\n font-size: var(--font-size-2xl);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: var(--spacing-3xl) 0 var(--spacing-lg) 0;\n padding-bottom: var(--spacing-sm);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.guide-content h3 {\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: var(--spacing-2xl) 0 var(--spacing-md) 0;\n}\n\n.guide-content h4 {\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n margin: var(--spacing-xl) 0 var(--spacing-sm) 0;\n}\n\n.guide-content p {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-lg);\n}\n\n.guide-content ul,\n.guide-content ol {\n margin: var(--spacing-lg) 0;\n padding-left: var(--spacing-2xl);\n}\n\n.guide-content li {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-sm);\n}\n\n.guide-content .code-block {\n margin: var(--spacing-xl) 0;\n}\n\n.guide-content .notice-box {\n margin: var(--spacing-xl) 0;\n}\n\n.guide-content blockquote {\n border-left: 4px solid var(--accent-primary);\n padding-left: var(--spacing-lg);\n margin: var(--spacing-xl) 0;\n font-style: italic;\n color: var(--text-secondary);\n}\n\n/* Specification content spacing - same as guide content */\n.spec-content {\n max-width: 800px;\n}\n\n.spec-content h1 {\n font-size: var(--font-size-3xl);\n font-weight: var(--font-weight-bold);\n color: var(--text-primary);\n margin: var(--spacing-4xl) 0 var(--spacing-xl) 0;\n}\n\n.spec-content h1:first-child {\n margin-top: 0;\n}\n\n.spec-content h2 {\n font-size: var(--font-size-2xl);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: var(--spacing-3xl) 0 var(--spacing-lg) 0;\n padding-bottom: var(--spacing-sm);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.spec-content h3 {\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: var(--spacing-2xl) 0 var(--spacing-md) 0;\n}\n\n.spec-content h4 {\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n margin: var(--spacing-xl) 0 var(--spacing-sm) 0;\n}\n\n.spec-content p {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-lg);\n}\n\n.spec-content ul,\n.spec-content ol {\n margin: var(--spacing-lg) 0;\n padding-left: var(--spacing-2xl);\n}\n\n.spec-content li {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-sm);\n}\n\n.spec-content .code-block {\n margin: var(--spacing-xl) 0;\n}\n\n.spec-content .notice-box {\n margin: var(--spacing-xl) 0;\n}\n\n.spec-content blockquote {\n border-left: 4px solid var(--accent-primary);\n padding-left: var(--spacing-lg);\n margin: var(--spacing-xl) 0;\n font-style: italic;\n color: var(--text-secondary);\n}\n\n.nav-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-md) var(--spacing-xl);\n cursor: pointer;\n transition: background-color var(--transition-fast);\n border-radius: var(--radius-sm);\n margin: 0 var(--spacing-md);\n}\n\n.nav-section-header:hover {\n background-color: var(--bg-hover);\n}\n\n.nav-section-header span {\n font-size: var(--font-size-lg);\n margin-right: var(--spacing-sm);\n}\n\n.nav-section-header h3 {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n margin: 0;\n flex: 1;\n}\n\n.section-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n background: none;\n border: none;\n color: var(--text-tertiary);\n cursor: pointer;\n border-radius: var(--radius-sm);\n transition: all var(--transition-fast);\n}\n\n.section-toggle:hover {\n color: var(--text-secondary);\n background-color: var(--bg-tertiary);\n}\n\n.section-toggle .chevron {\n transition: transform var(--transition-fast);\n}\n\n.section-toggle.collapsed .chevron {\n transform: rotate(-90deg);\n}\n\n/* Main navigation sections */\n.nav-section .nav-list {\n transition: max-height var(--transition-normal), opacity var(--transition-fast);\n overflow: hidden;\n max-height: 1000px;\n opacity: 1;\n}\n\n.nav-section .nav-list.collapsed {\n max-height: 0;\n opacity: 0;\n margin: 0;\n padding: 0;\n}\n\n.nav-list {\n list-style: none;\n margin: 0;\n padding: 0 0 0 var(--spacing-lg);\n}\n\n.nav-list.collapsed {\n display: none;\n}\n\n.nav-item {\n margin: 0;\n}\n\n.nav-link {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-xl);\n color: var(--text-secondary);\n text-decoration: none;\n font-size: var(--font-size-sm);\n border-left: 2px solid transparent;\n transition: all var(--transition-fast);\n overflow: hidden;\n min-width: 0;\n}\n\n.nav-link:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n text-decoration: none;\n}\n\n.nav-link.active {\n color: var(--accent-primary);\n background-color: var(--bg-active);\n border-left-color: var(--accent-primary);\n}\n\n/* Nav Group Items - Tree Structure */\n.nav-group {\n margin-bottom: var(--spacing-xs);\n margin-left: var(--spacing-md);\n position: relative;\n}\n\n\n.nav-group-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-sm) var(--spacing-md);\n cursor: pointer;\n transition: background-color var(--transition-fast);\n border-radius: var(--radius-sm);\n margin: 0 var(--spacing-xs);\n}\n\n.nav-group-header:hover {\n background-color: var(--bg-hover);\n}\n\n.nav-group-header.expanded {\n background-color: var(--bg-active);\n}\n\n.nav-group-title {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n text-transform: capitalize;\n flex: 1;\n}\n\n.nav-group-count {\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n min-width: 1.5rem;\n text-align: center;\n margin-right: var(--spacing-sm);\n}\n\n.nav-group-chevron {\n color: var(--text-tertiary);\n transition: transform var(--transition-fast);\n}\n\n.nav-group-header.expanded .nav-group-chevron {\n transform: rotate(90deg);\n}\n\n.nav-sublist {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease-in-out, overflow 0.3s ease-in-out;\n margin-left: var(--spacing-lg);\n position: relative;\n list-style: none;\n padding: 0;\n}\n\n\n.nav-subitem {\n position: relative;\n}\n\n\n.nav-subitem .nav-link {\n padding: var(--spacing-xs) var(--spacing-md);\n font-size: var(--font-size-xs);\n margin: var(--spacing-xs) 0;\n}\n\n/* Method Badges */\n.method-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: var(--radius-sm);\n color: white;\n flex-shrink: 0;\n}\n\n.method-badge.small {\n padding: 0.125rem 0.375rem;\n min-width: 2.5rem;\n}\n\n.method-badge.large {\n padding: 0.25rem 0.5rem;\n min-width: 3rem;\n}\n\n.method-badge.method-get {\n background-color: var(--method-get);\n}\n\n.method-badge.method-post {\n background-color: var(--method-post);\n}\n\n.method-badge.method-put {\n background-color: var(--method-put);\n}\n\n.method-badge.method-delete {\n background-color: var(--method-delete);\n}\n\n.method-badge.method-patch {\n background-color: var(--method-patch);\n}\n\n.method-badge.method-head {\n background-color: var(--method-head);\n}\n\n.method-badge.method-options {\n background-color: var(--method-options);\n}\n\n/* Endpoint Path */\n.endpoint-path {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n min-width: 0;\n}\n\n/* Schema Icons */\n.schema-icon {\n font-size: var(--font-size-sm);\n}\n\n.schema-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n}\n\n/* Schema tree structure */\n#schemas-nav .nav-item {\n margin-left: var(--spacing-md);\n position: relative;\n}\n\n\n\n#schemas-nav .nav-link {\n padding: var(--spacing-xs) var(--spacing-md);\n margin: var(--spacing-xs) 0;\n}\n\n/* Breadcrumb */\n.breadcrumb {\n margin-bottom: var(--spacing-2xl);\n padding: var(--spacing-md) 0;\n border-bottom: 1px solid var(--border-primary);\n}\n\n.breadcrumb-list {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.breadcrumb-item {\n display: flex;\n align-items: center;\n font-size: var(--font-size-sm);\n}\n\n.breadcrumb-item:not(:last-child)::after {\n content: '/';\n color: var(--text-tertiary);\n margin-left: var(--spacing-sm);\n}\n\n.breadcrumb-item a {\n color: var(--text-link);\n text-decoration: none;\n}\n\n.breadcrumb-item a:hover {\n color: var(--text-link-hover);\n text-decoration: underline;\n}\n\n.breadcrumb-item.active span {\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n\n/* Content Sections */\n.content-section {\n margin-bottom: 0;\n}\n\n.section-header {\n margin-bottom: var(--spacing-2xl);\n padding-bottom: var(--spacing-lg);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.section-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n margin-top: var(--spacing-md);\n}\n\n.version-badge {\n display: inline-flex;\n align-items: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-sm);\n}\n\n.github-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n color: var(--text-link);\n text-decoration: none;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n transition: color var(--transition-fast);\n}\n\n.github-link:hover {\n color: var(--text-link-hover);\n text-decoration: none;\n}\n\n/* Endpoint Sections */\n.endpoint-section .section-header {\n position: relative;\n}\n\n.endpoint-title {\n display: flex;\n align-items: center;\n gap: var(--spacing-lg);\n flex-wrap: wrap;\n}\n\n.endpoint-title h2 {\n font-family: var(--font-family-mono);\n font-weight: var(--font-weight-medium);\n margin: 0;\n word-break: break-all;\n}\n\n.endpoint-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.tag {\n display: inline-flex;\n align-items: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n color: var(--text-secondary);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-sm);\n text-transform: capitalize;\n}\n\n.endpoint-summary {\n font-size: var(--font-size-lg);\n color: var(--text-primary);\n margin-bottom: var(--spacing-xl);\n}\n\n.endpoint-description {\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-bottom: var(--spacing-xl);\n}\n\n/* Parameters */\n.parameters-section {\n margin-bottom: var(--spacing-4xl);\n}\n\n.parameters-section h3 {\n margin-bottom: var(--spacing-xl);\n}\n\n.parameter-group {\n margin-bottom: var(--spacing-md);\n margin-top: var(--spacing-md);\n}\n\n.parameter-group-title {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n margin-bottom: var(--spacing-lg);\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n}\n\n.parameter-group-title::before {\n content: '';\n width: 4px;\n height: 4px;\n background-color: var(--accent-primary);\n border-radius: 50%;\n}\n\n.parameter-table {\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.parameter-row {\n padding: var(--spacing-lg);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.parameter-row:last-child {\n border-bottom: none;\n}\n\n.parameter-info {\n width: 100%;\n}\n\n.parameter-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n margin-bottom: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.parameter-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.required-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem 0.375rem;\n background-color: var(--accent-danger);\n color: white;\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: var(--radius-sm);\n}\n\n.optional-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem 0.375rem;\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n border-radius: var(--radius-sm);\n}\n\n.parameter-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-link);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n display: inline-block;\n margin-bottom: var(--spacing-sm);\n}\n\n.parameter-description {\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n/* Request Body */\n.request-body-section {\n margin-bottom: var(--spacing-4xl);\n}\n\n.request-body-description {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-lg);\n}\n\n/* Responses */\n.responses-section {\n margin-bottom: var(--spacing-4xl);\n}\n\n.responses-list {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xl);\n}\n\n.response-item {\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.response-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n padding: var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.status-code {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 3rem;\n padding: 0.25rem 0.5rem;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: white;\n border-radius: var(--radius-sm);\n}\n\n.status-code.status-success {\n background-color: var(--status-success);\n}\n\n.status-code.status-redirect {\n background-color: var(--status-redirect);\n}\n\n.status-code.status-client-error {\n background-color: var(--status-client-error);\n}\n\n.status-code.status-server-error {\n background-color: var(--status-server-error);\n}\n\n.response-description {\n flex: 1;\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n}\n\n/* Content Sections */\n.content-section {\n padding: var(--spacing-lg) var(--spacing-lg) var(--spacing-sm) var(--spacing-lg);\n}\n\n.media-type-section {\n margin-bottom: 0;\n}\n\n.media-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n margin-bottom: var(--spacing-lg);\n}\n\n/* Schema Components */\n.schema-section .section-header {\n margin-bottom: var(--spacing-2xl);\n}\n\n.schema-title {\n font-family: var(--font-family-mono);\n margin: 0;\n}\n\n.schema-type-badge {\n display: inline-flex;\n align-items: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n color: var(--text-secondary);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-sm);\n text-transform: lowercase;\n}\n\n.schema-summary {\n font-size: var(--font-size-lg);\n color: var(--text-primary);\n margin-bottom: var(--spacing-xl);\n}\n\n.schema-definition {\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n padding: var(--spacing-xl);\n}\n\n.schema-object,\n.schema-array,\n.schema-simple {\n margin-bottom: var(--spacing-lg);\n}\n\n.schema-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-link);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n display: inline-block;\n margin-bottom: var(--spacing-sm);\n}\n\n.schema-properties {\n margin-left: var(--spacing-lg);\n border-left: 2px solid var(--border-primary);\n padding-left: var(--spacing-lg);\n}\n\n.schema-property {\n margin-bottom: var(--spacing-lg);\n padding-bottom: var(--spacing-lg);\n border-bottom: 1px solid var(--border-secondary);\n}\n\n.schema-property:last-child {\n border-bottom: none;\n margin-bottom: 0;\n padding-bottom: 0;\n}\n\n.property-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.property-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.property-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-link);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n}\n\n.property-description {\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-left: var(--spacing-lg);\n}\n\n.schema-ref {\n margin: var(--spacing-sm) 0;\n}\n\n.schema-ref-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n color: var(--text-link);\n text-decoration: none;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n transition: all var(--transition-fast);\n}\n\n.schema-ref-link:hover {\n color: var(--text-link-hover);\n background-color: var(--bg-hover);\n text-decoration: none;\n}\n\n.schema-description {\n margin-left: var(--spacing-sm);\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n}\n\n/* Example Sections */\n.example-section,\n.example-request-section {\n margin-bottom: var(--spacing-4xl);\n}\n\n.code-block {\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.code-header,\n.example-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: var(--bg-secondary);\n border-bottom: 1px solid var(--border-primary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-secondary);\n}\n\n.copy-button {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.copy-button:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n}\n\n.copy-button.copied {\n color: var(--accent-success);\n border-color: var(--accent-success);\n}\n\n/* Overview Components */\n.lead {\n font-size: var(--font-size-xl);\n color: var(--text-primary);\n margin-bottom: var(--spacing-4xl);\n line-height: var(--line-height-relaxed);\n}\n\n.features-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: var(--spacing-2xl);\n margin-bottom: var(--spacing-4xl);\n}\n\n.feature-card {\n padding: var(--spacing-2xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n transition: all var(--transition-normal);\n}\n\n.feature-card:hover {\n border-color: var(--border-secondary);\n transform: translateY(-2px);\n box-shadow: var(--shadow-lg);\n}\n\n.feature-icon {\n font-size: 2rem;\n margin-bottom: var(--spacing-lg);\n display: block;\n}\n\n.feature-card h3 {\n margin-bottom: var(--spacing-md);\n color: var(--text-primary);\n}\n\n.feature-card p {\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n}\n\n.quick-start {\n margin-top: var(--spacing-4xl);\n}\n\n.quick-start h3 {\n margin-bottom: var(--spacing-xl);\n color: var(--text-primary);\n}\n\n.notice-box {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-md);\n padding: var(--spacing-lg);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-left: 4px solid var(--accent-primary);\n border-radius: var(--radius-md);\n margin-top: var(--spacing-xl);\n}\n\n.notice-icon {\n font-size: var(--font-size-lg);\n flex-shrink: 0;\n}\n\n.notice-content {\n flex: 1;\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n.notice-content strong {\n color: var(--text-primary);\n}\n\n/* Search Results */\n.search-results {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-top: none;\n border-radius: 0 0 var(--radius-lg) var(--radius-lg);\n box-shadow: var(--shadow-xl);\n z-index: 1000;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.search-results-content {\n padding: var(--spacing-lg);\n}\n\n.search-section {\n margin-bottom: var(--spacing-xl);\n}\n\n.search-section:last-child {\n margin-bottom: 0;\n}\n\n.search-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-md);\n}\n\n.search-section-header h4 {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin: 0;\n}\n\n.search-count {\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n min-width: 1.5rem;\n text-align: center;\n}\n\n.search-items {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n}\n\n.search-item {\n display: block;\n padding: var(--spacing-md);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n cursor: pointer;\n transition: all var(--transition-fast);\n text-decoration: none;\n color: inherit;\n}\n\n.search-item:hover {\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n text-decoration: none;\n color: inherit;\n}\n\n.search-item-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-xs);\n}\n\n.search-item-path,\n.search-item-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.search-item-type {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n color: var(--text-link);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n}\n\n.search-item-summary {\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n line-height: var(--line-height-normal);\n margin-bottom: var(--spacing-xs);\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search-item-tags {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n flex-wrap: wrap;\n}\n\n.search-tag {\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n text-transform: capitalize;\n}\n\n.search-item-more {\n padding: var(--spacing-sm);\n text-align: center;\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n font-style: italic;\n}\n\n.search-no-results {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-4xl) var(--spacing-2xl);\n text-align: center;\n}\n\n.no-results-icon {\n font-size: 3rem;\n margin-bottom: var(--spacing-lg);\n opacity: 0.5;\n}\n\n.no-results-text p {\n margin-bottom: var(--spacing-sm);\n color: var(--text-primary);\n}\n\n.no-results-text small {\n color: var(--text-tertiary);\n font-size: var(--font-size-sm);\n}\n\n/* API Explorer Components */\n.api-explorer {\n margin-top: var(--spacing-4xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n overflow: hidden;\n}\n\n.explorer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-lg) var(--spacing-xl);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.explorer-header h3 {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n}\n\n.try-button {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: var(--accent-primary);\n color: white;\n border: none;\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.try-button:hover {\n background-color: var(--text-link-hover);\n transform: translateY(-1px);\n}\n\n.try-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.explorer-content {\n padding: var(--spacing-xl);\n}\n\n.request-config {\n margin-bottom: var(--spacing-4xl);\n}\n\n.config-section {\n margin-bottom: var(--spacing-2xl);\n}\n\n.config-section h4 {\n color: var(--text-primary);\n margin-bottom: var(--spacing-lg);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n}\n\n.section-description {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-lg);\n font-size: var(--font-size-sm);\n}\n\n/* URL Builder */\n.url-builder {\n margin-bottom: var(--spacing-lg);\n}\n\n.url-display {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n padding: var(--spacing-sm);\n}\n\n.request-url {\n flex: 1;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background: none;\n border: none;\n outline: none;\n padding: var(--spacing-sm);\n}\n\n.copy-url-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.copy-url-button:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n}\n\n/* Parameter Forms */\n.parameters-form {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xl);\n}\n\n.parameter-group h5 {\n color: var(--text-primary);\n margin-bottom: var(--spacing-lg);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n}\n\n.parameter-input {\n margin-bottom: var(--spacing-lg);\n}\n\n.parameter-label {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.param-input {\n width: 100%;\n padding: var(--spacing-md);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n transition: border-color var(--transition-fast);\n}\n\n.param-input:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.1);\n}\n\n.param-input::placeholder {\n color: var(--text-tertiary);\n}\n\n/* Request Body Input */\n.request-body-input {\n position: relative;\n}\n\n.input-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-sm);\n}\n\n.input-header span {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n}\n\n.format-json-button {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.format-json-button:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n}\n\n.json-input {\n width: 100%;\n min-height: 200px;\n padding: var(--spacing-lg);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n resize: vertical;\n transition: border-color var(--transition-fast);\n}\n\n.json-input:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.1);\n}\n\n/* Headers Input */\n.headers-input {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n}\n\n.header-row,\n.custom-header-row {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n}\n\n.header-name,\n.header-value {\n flex: 1;\n padding: var(--spacing-sm) var(--spacing-md);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n transition: border-color var(--transition-fast);\n}\n\n.header-name:focus,\n.header-value:focus {\n outline: none;\n border-color: var(--border-focus);\n}\n\n.add-header-button,\n.remove-header-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n color: var(--text-tertiary);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.add-header-button:hover {\n color: var(--accent-success);\n border-color: var(--accent-success);\n}\n\n.remove-header-button:hover {\n color: var(--accent-danger);\n border-color: var(--accent-danger);\n}\n\n/* Request/Response Area */\n.request-response-area {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-2xl);\n}\n\n.request-preview {\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.section-header h4 {\n margin: 0;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.copy-request-button,\n.copy-response-button {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.copy-request-button:hover,\n.copy-response-button:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n}\n\n/* Response Area */\n.response-area {\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.response-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n}\n\n.response-time {\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n padding: 0.125rem 0.375rem;\n background-color: var(--bg-secondary);\n border-radius: var(--radius-sm);\n}\n\n.response-status {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-semibold);\n padding: 0.125rem 0.375rem;\n border-radius: var(--radius-sm);\n color: white;\n}\n\n/* Tab Navigation */\n.tab-navigation {\n display: flex;\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md) var(--radius-md) 0 0;\n margin-bottom: 0;\n}\n\n.tab-navigation .tab-button {\n flex: 1;\n padding: var(--spacing-lg) var(--spacing-xl);\n background: none;\n border: none;\n color: var(--text-secondary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n border-bottom: 3px solid transparent;\n position: relative;\n}\n\n.tab-navigation .tab-button:first-child {\n border-radius: var(--radius-md) 0 0 0;\n}\n\n.tab-navigation .tab-button:last-child {\n border-radius: 0 var(--radius-md) 0 0;\n}\n\n.tab-navigation .tab-button:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n}\n\n.tab-navigation .tab-button.active {\n color: var(--accent-primary);\n border-bottom-color: var(--accent-primary);\n background-color: var(--bg-primary);\n}\n\n.tab-content {\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-top: none;\n border-radius: 0 0 var(--radius-md) var(--radius-md);\n overflow: hidden;\n}\n\n.tab-pane {\n display: none;\n padding: var(--spacing-2xl);\n animation: fadeIn 0.2s ease-in-out;\n}\n\n.tab-pane.active {\n display: block;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Getting Started Styles */\n.getting-started-content {\n max-width: 900px;\n}\n\n.setup-steps {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3xl);\n margin-bottom: var(--spacing-4xl);\n}\n\n.setup-step {\n display: flex;\n gap: var(--spacing-xl);\n align-items: flex-start;\n}\n\n.step-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background-color: var(--accent-primary);\n color: white;\n font-weight: var(--font-weight-bold);\n font-size: var(--font-size-lg);\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: var(--spacing-sm);\n}\n\n.step-content {\n flex: 1;\n}\n\n.step-content h4 {\n margin-bottom: var(--spacing-lg);\n color: var(--text-primary);\n font-size: var(--font-size-lg);\n}\n\n.step-content p {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-lg);\n font-size: var(--font-size-sm);\n}\n\n.configuration-section {\n margin-top: var(--spacing-4xl);\n}\n\n.configuration-section h3 {\n margin-bottom: var(--spacing-xl);\n color: var(--text-primary);\n}\n\n.configuration-section p {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-xl);\n}\n\n.config-table {\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.config-row {\n display: flex;\n align-items: center;\n padding: var(--spacing-lg);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.config-row:last-child {\n border-bottom: none;\n}\n\n.config-key {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n min-width: 200px;\n padding-right: var(--spacing-lg);\n}\n\n.config-desc {\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-relaxed);\n flex: 1;\n}\n\n/* Enhanced Features Styles */\n.features-content {\n max-width: 1200px;\n}\n\n.features-content .features-grid {\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: var(--spacing-3xl);\n margin-bottom: var(--spacing-5xl);\n}\n\n.feature-card.detailed {\n padding: var(--spacing-3xl);\n min-height: 280px;\n}\n\n.feature-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-lg);\n margin-bottom: var(--spacing-lg);\n}\n\n.feature-header .feature-icon {\n font-size: 2.5rem;\n margin-bottom: 0;\n}\n\n.feature-header h3 {\n margin: 0;\n font-size: var(--font-size-xl);\n}\n\n.feature-card.detailed p {\n font-size: var(--font-size-base);\n margin-bottom: var(--spacing-lg);\n line-height: var(--line-height-relaxed);\n}\n\n.feature-list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.feature-list li {\n position: relative;\n padding-left: var(--spacing-xl);\n margin-bottom: var(--spacing-md);\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-relaxed);\n}\n\n.feature-list li::before {\n content: '•';\n position: absolute;\n left: 0;\n color: var(--accent-primary);\n font-weight: var(--font-weight-bold);\n}\n\n.technical-features {\n margin-top: var(--spacing-4xl);\n}\n\n.technical-features h3 {\n margin-bottom: var(--spacing-3xl);\n color: var(--text-primary);\n text-align: center;\n}\n\n.tech-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: var(--spacing-2xl);\n}\n\n.tech-item {\n text-align: center;\n padding: var(--spacing-2xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n transition: all var(--transition-normal);\n}\n\n.tech-item:hover {\n border-color: var(--border-secondary);\n transform: translateY(-4px);\n box-shadow: var(--shadow-md);\n}\n\n.tech-item h4 {\n margin-bottom: var(--spacing-lg);\n color: var(--text-primary);\n font-size: var(--font-size-lg);\n}\n\n.tech-item p {\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-relaxed);\n margin: 0;\n}\n\n/* Response Tabs */\n.response-tabs {\n display: flex;\n background-color: var(--bg-secondary);\n border-bottom: 1px solid var(--border-primary);\n}\n\n.response-tabs .tab-button {\n flex: 1;\n padding: var(--spacing-md) var(--spacing-lg);\n background: none;\n border: none;\n color: var(--text-secondary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n border-bottom: 2px solid transparent;\n}\n\n.response-tabs .tab-button:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n}\n\n.response-tabs .tab-button.active {\n color: var(--accent-primary);\n border-bottom-color: var(--accent-primary);\n background-color: var(--bg-primary);\n}\n\n.response-content {\n position: relative;\n}\n\n.tab-content {\n display: none;\n padding: var(--spacing-lg);\n}\n\n.tab-content.active {\n display: block;\n}\n\n/* Headers List */\n.headers-list {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n}\n\n.header-item {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) 0;\n border-bottom: 1px solid var(--border-secondary);\n}\n\n.header-item:last-child {\n border-bottom: none;\n}\n\n.header-name {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n min-width: 120px;\n}\n\n.header-value {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n word-break: break-all;\n flex: 1;\n}\n\n/* Loading State */\n.loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-4xl);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n}\n\n.loading-spinner {\n display: flex;\n align-items: center;\n gap: var(--spacing-lg);\n color: var(--text-secondary);\n}\n\n.spinner.small {\n width: 24px;\n height: 24px;\n border-width: 2px;\n}\n\n/* Error State */\n.error-state {\n background-color: var(--bg-primary);\n border: 1px solid var(--accent-danger);\n border-radius: var(--radius-md);\n padding: var(--spacing-xl);\n}\n\n.error-content {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-lg);\n}\n\n.error-icon {\n font-size: 2rem;\n flex-shrink: 0;\n}\n\n.error-message {\n flex: 1;\n}\n\n.error-message h5 {\n color: var(--accent-danger);\n margin-bottom: var(--spacing-sm);\n font-size: var(--font-size-base);\n}\n\n.error-message p {\n color: var(--text-secondary);\n margin-bottom: var(--spacing-lg);\n}\n\n.error-details {\n margin-top: var(--spacing-md);\n}\n\n.error-details summary {\n color: var(--text-tertiary);\n cursor: pointer;\n font-size: var(--font-size-sm);\n margin-bottom: var(--spacing-sm);\n}\n\n.error-details pre {\n background-color: var(--bg-secondary);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n max-height: 200px;\n overflow-y: auto;\n}\n\n/* Interactive Parameter Input Forms */\n.example-request-section {\n margin-top: var(--spacing-4xl);\n background-color: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n overflow: hidden;\n}\n\n.example-request-section h3 {\n margin: 0;\n padding: var(--spacing-lg) var(--spacing-xl);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n color: var(--text-primary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n}\n\n.parameter-form {\n padding: var(--spacing-2xl);\n margin: var(--spacing-lg);\n}\n\n.parameter-section {\n margin-bottom: var(--spacing-xl);\n margin-top: var(--spacing-xl);\n}\n\n.parameter-section:last-child {\n margin-bottom: 0;\n}\n\n.parameter-section h4 {\n margin: 0 0 var(--spacing-lg) var(--spacing-sm);\n color: var(--text-primary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.025em;\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n}\n\n.parameter-section h4::before {\n content: '';\n width: 4px;\n height: 4px;\n background-color: var(--accent-primary);\n border-radius: 50%;\n}\n\n.parameter-inputs {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-md);\n margin-left: var(--spacing-sm);\n margin-right: var(--spacing-sm);\n}\n\n.param-input-group {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-sm);\n}\n\n.param-label {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n flex-wrap: wrap;\n margin-left: var(--spacing-xs);\n}\n\n.param-input {\n padding: var(--spacing-sm) var(--spacing-md);\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n transition: all var(--transition-fast);\n width: calc(100% - var(--spacing-md));\n box-sizing: border-box;\n margin: 0 var(--spacing-xs);\n}\n\n.param-input:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.1);\n}\n\n.param-input::placeholder {\n color: var(--text-tertiary);\n font-style: italic;\n}\n\n.param-input.error {\n border-color: var(--accent-danger);\n box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.1);\n}\n\n.param-input.error:focus {\n border-color: var(--accent-danger);\n box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.2);\n}\n\n.param-description {\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n line-height: var(--line-height-relaxed);\n margin-top: var(--spacing-xs);\n margin-left: var(--spacing-md);\n}\n\n.parameter-error {\n display: none;\n font-size: var(--font-size-xs);\n color: var(--accent-danger);\n margin-top: var(--spacing-xs);\n margin-left: var(--spacing-md);\n}\n\n.parameter-error.show {\n display: block;\n}\n\n.generate-curl-section {\n margin: var(--spacing-2xl) var(--spacing-lg) var(--spacing-lg) var(--spacing-lg);\n padding-top: var(--spacing-2xl);\n border-top: 1px solid var(--border-primary);\n}\n\n.generate-curl-btn {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: var(--accent-primary);\n color: white;\n border: none;\n border-radius: var(--radius-sm);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n margin: 0 var(--spacing-sm) var(--spacing-lg) var(--spacing-sm);\n}\n\n.generate-curl-btn:hover {\n background-color: var(--text-link-hover);\n transform: translateY(-1px);\n}\n\n.generate-curl-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.send-request-btn {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-md) var(--spacing-lg);\n background-color: #2ea043;\n color: white;\n border: none;\n border-radius: var(--radius-sm);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-fast);\n margin: 0 var(--spacing-sm) var(--spacing-lg) var(--spacing-sm);\n}\n\n.send-request-btn:hover {\n background-color: #3fb950;\n transform: translateY(-1px);\n}\n\n.send-request-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.generate-curl-section {\n display: flex;\n gap: var(--spacing-sm);\n flex-wrap: wrap;\n}\n\n.response-section {\n margin: var(--spacing-md) var(--spacing-sm) 0 var(--spacing-sm);\n}\n\n.response-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n margin-bottom: var(--spacing-sm);\n}\n\n.response-header h4 {\n margin: 0;\n}\n\n.response-status {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n padding: 2px 8px;\n border-radius: var(--radius-sm);\n}\n\n.response-status.status-success {\n background-color: rgba(46, 160, 67, 0.2);\n color: #3fb950;\n}\n\n.response-status.status-error {\n background-color: rgba(248, 81, 73, 0.2);\n color: #f85149;\n}\n\n.response-time {\n font-size: var(--font-size-xs);\n color: var(--text-secondary);\n}\n\n.generated-curl-section {\n margin: var(--spacing-md) var(--spacing-sm) 0 var(--spacing-sm);\n}\n\n.generated-curl-container {\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n overflow: hidden;\n margin: var(--spacing-xs);\n}\n\n.generated-curl-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-sm) var(--spacing-md);\n background-color: var(--bg-tertiary);\n border-bottom: 1px solid var(--border-primary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-secondary);\n}\n\n.generated-curl-code {\n padding: var(--spacing-md) var(--spacing-lg);\n}\n\n.generated-curl-code pre {\n margin: 0;\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n color: var(--text-primary);\n line-height: var(--line-height-relaxed);\n white-space: pre-wrap;\n word-break: break-all;\n}\n\n.copy-generated-curl {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-tertiary);\n font-size: var(--font-size-xs);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.copy-generated-curl:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n}\n\n.copy-generated-curl.copied {\n color: var(--accent-success);\n border-color: var(--accent-success);\n}\n\n/* Responsive design for parameter forms */\n@media (max-width: 768px) {\n .example-request-section h3 {\n padding: var(--spacing-md) var(--spacing-lg);\n font-size: var(--font-size-sm);\n }\n \n .parameter-form {\n padding: var(--spacing-lg);\n margin: var(--spacing-md);\n }\n \n .parameter-section {\n margin-bottom: var(--spacing-xl);\n }\n \n .parameter-section h4 {\n font-size: var(--font-size-xs);\n margin: var(--spacing-xs) 0 var(--spacing-md) var(--spacing-xs);\n }\n \n .parameter-inputs {\n margin-left: var(--spacing-xs);\n margin-right: var(--spacing-xs);\n }\n \n .param-label {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n font-size: var(--font-size-xs);\n margin-left: var(--spacing-xs);\n }\n \n .param-input {\n padding: var(--spacing-xs) var(--spacing-sm);\n font-size: var(--font-size-xs);\n width: calc(100% - var(--spacing-sm));\n margin: 0 var(--spacing-xs);\n }\n \n .generate-curl-section {\n margin: var(--spacing-xl) var(--spacing-md) var(--spacing-md) var(--spacing-md);\n padding-top: var(--spacing-xl);\n }\n \n .generate-curl-btn {\n width: calc(100% - var(--spacing-lg));\n justify-content: center;\n padding: var(--spacing-sm) var(--spacing-md);\n font-size: var(--font-size-xs);\n margin: 0 var(--spacing-xs) var(--spacing-md) var(--spacing-xs);\n }\n \n .generated-curl-section {\n margin: var(--spacing-sm) var(--spacing-xs) 0 var(--spacing-xs);\n }\n \n .generated-curl-container {\n margin: var(--spacing-xs);\n }\n \n .generated-curl-header {\n padding: var(--spacing-xs) var(--spacing-sm);\n font-size: var(--font-size-xs);\n }\n \n .generated-curl-code {\n padding: var(--spacing-sm) var(--spacing-md);\n }\n \n .generated-curl-code pre {\n font-size: var(--font-size-xs);\n }\n}\n\n/* Configuration Cards */\n.config-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: var(--spacing-lg);\n margin: var(--spacing-xl) 0;\n}\n\n.config-card {\n background: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n padding: var(--spacing-lg);\n transition: all 0.2s ease;\n}\n\n.config-card:hover {\n border-color: var(--accent-primary);\n background: var(--bg-tertiary);\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n}\n\n.config-card h4 {\n color: var(--text-primary);\n margin: 0 0 var(--spacing-sm) 0;\n font-size: var(--font-size-base);\n font-weight: 600;\n}\n\n.config-card p {\n color: var(--text-secondary);\n margin: 0;\n font-size: var(--font-size-sm);\n line-height: 1.5;\n}\n\n.config-example {\n margin: var(--spacing-lg) 0 var(--spacing-xl) 0;\n}\n\n.config-example h4 {\n color: var(--text-primary);\n margin: 0 0 var(--spacing-md) 0;\n font-size: var(--font-size-lg);\n font-weight: 600;\n}\n\n.config-guide-link {\n color: var(--accent-primary);\n text-decoration: none;\n font-weight: 500;\n transition: color 0.2s ease;\n}\n\n.config-guide-link:hover {\n color: var(--accent-primary);\n text-decoration: underline;\n}\n\n@media (max-width: 768px) {\n .config-cards {\n grid-template-columns: 1fr;\n gap: var(--spacing-md);\n }\n \n .config-card {\n padding: var(--spacing-md);\n }\n}\n\n/* Internal Link Styling */\n.internal-link {\n color: var(--accent-primary);\n text-decoration: none;\n font-weight: 500;\n transition: color 0.2s ease;\n border-bottom: 1px solid transparent;\n}\n\n.internal-link:hover {\n color: var(--accent-primary);\n text-decoration: none;\n border-bottom-color: var(--accent-primary);\n}\n\n/* Smooth scroll behavior for anchored elements */\nhtml {\n scroll-behavior: smooth;\n}\n\n/* Add some padding to headers when they're targeted by anchors */\nh1[id], h2[id], h3[id], h4[id] {\n scroll-margin-top: 80px; /* Account for fixed header */\n position: relative;\n}\n\n/* Highlight targeted sections briefly */\nh1[id]:target, h2[id]:target, h3[id]:target, h4[id]:target {\n animation: highlightTarget 2s ease-out;\n}\n\n@keyframes highlightTarget {\n 0% {\n background-color: rgba(88, 166, 255, 0.2);\n }\n 100% {\n background-color: transparent;\n }\n}\n\n/* Configuration Tables */\n.table-container {\n margin: var(--spacing-xl) 0;\n overflow-x: auto;\n border-radius: var(--radius-md);\n border: 1px solid var(--border-primary);\n background: var(--bg-secondary);\n}\n\n.config-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--font-size-sm);\n background: transparent;\n}\n\n.config-table thead {\n background: var(--bg-tertiary);\n border-bottom: 2px solid var(--border-primary);\n}\n\n.config-table thead th {\n padding: var(--spacing-md) var(--spacing-lg);\n text-align: left;\n font-weight: 600;\n color: var(--text-primary);\n border-right: 1px solid var(--border-primary);\n white-space: nowrap;\n}\n\n.config-table thead th:last-child {\n border-right: none;\n}\n\n.config-table tbody tr {\n border-bottom: 1px solid var(--border-secondary);\n transition: background-color 0.2s ease;\n}\n\n.config-table tbody tr:hover {\n background: rgba(88, 166, 255, 0.05);\n}\n\n.config-table tbody tr:last-child {\n border-bottom: none;\n}\n\n.config-table tbody td {\n padding: var(--spacing-md) var(--spacing-lg);\n color: var(--text-secondary);\n border-right: 1px solid var(--border-secondary);\n vertical-align: top;\n line-height: 1.5;\n}\n\n.config-table tbody td:last-child {\n border-right: none;\n}\n\n/* First column (Variable names) styling */\n.config-table tbody td:first-child {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-weight: 600;\n color: var(--accent-primary);\n background: rgba(88, 166, 255, 0.08);\n white-space: nowrap;\n}\n\n/* Second column (Required) styling */\n.config-table tbody td:nth-child(2) {\n text-align: center;\n font-weight: 600;\n white-space: nowrap;\n}\n\n/* Third column (Default) styling */\n.config-table tbody td:nth-child(3) {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: var(--font-size-xs);\n color: var(--text-tertiary);\n white-space: nowrap;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Special styling for checkmarks and cross marks */\n.config-table tbody td:nth-child(2):contains('✅') {\n color: #10b981;\n}\n\n.config-table tbody td:nth-child(2):contains('❌') {\n color: #ef4444;\n}\n\n/* Code elements in tables */\n.config-table code {\n background: rgba(88, 166, 255, 0.1);\n padding: 2px 6px;\n border-radius: var(--radius-sm);\n font-size: var(--font-size-xs);\n color: var(--accent-primary);\n}\n\n/* Responsive table behavior */\n@media (max-width: 768px) {\n .table-container {\n margin: var(--spacing-lg) -var(--spacing-md);\n border-left: none;\n border-right: none;\n border-radius: 0;\n }\n \n .config-table {\n font-size: var(--font-size-xs);\n }\n \n .config-table thead th,\n .config-table tbody td {\n padding: var(--spacing-sm) var(--spacing-md);\n }\n \n .config-table tbody td:nth-child(3) {\n max-width: 120px;\n }\n}\n\n@media (max-width: 480px) {\n .config-table thead th,\n .config-table tbody td {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .config-table thead th {\n font-size: var(--font-size-xs);\n }\n \n .config-table tbody td:nth-child(3) {\n max-width: 80px;\n }\n}\n\n/* Schema/Example Tabs Styling */\n.schema-example-tabs {\n margin-top: var(--spacing-lg);\n}\n\n.tab-headers {\n display: flex;\n border-bottom: 1px solid var(--border-primary);\n margin-bottom: 0;\n}\n\n.tab-header {\n background: none;\n border: none;\n padding: var(--spacing-md) var(--spacing-lg);\n color: var(--text-secondary);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n border-bottom: 2px solid transparent;\n transition: all var(--transition-fast);\n position: relative;\n}\n\n.tab-header:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n}\n\n.tab-header.active {\n color: var(--accent-primary);\n border-bottom-color: var(--accent-primary);\n background-color: var(--bg-tertiary);\n}\n\n.tab-contents {\n position: relative;\n min-height: 200px;\n}\n\n.tab-content {\n display: none;\n padding: var(--spacing-lg);\n animation: fadeIn 0.2s ease-in-out;\n}\n\n.tab-content.active {\n display: block;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; transform: translateY(5px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Generated Example Styling */\n.generated-example-section {\n background-color: var(--bg-secondary);\n border-radius: var(--radius-md);\n overflow: hidden;\n border: 1px solid var(--border-secondary);\n margin-bottom: 0;\n}\n\n.generated-example-section .example-header {\n background-color: var(--bg-tertiary);\n padding: var(--spacing-md) var(--spacing-lg);\n border-bottom: 1px solid var(--border-primary);\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n\n.generated-example-section .code-block {\n margin: 0;\n background-color: var(--bg-primary);\n}\n\n.generated-example-section .code-block pre {\n margin: 0;\n padding: var(--spacing-lg);\n background: transparent;\n border: none;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.example-note {\n padding: var(--spacing-sm) var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border-top: 1px solid var(--border-primary);\n color: var(--text-secondary);\n}\n\n.example-note small {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n font-size: var(--font-size-xs);\n}\n\n/* No Example/Error States */\n.no-example, .example-error {\n padding: var(--spacing-xl);\n text-align: center;\n color: var(--text-secondary);\n background-color: var(--bg-secondary);\n border: 1px dashed var(--border-primary);\n border-radius: var(--radius-md);\n}\n\n.example-error {\n color: var(--accent-warning);\n border-color: var(--accent-warning);\n background-color: rgba(210, 153, 34, 0.05);\n}\n\n.example-error span {\n display: block;\n font-weight: var(--font-weight-medium);\n margin-bottom: var(--spacing-xs);\n}\n\n/* Copy Button Enhancement */\n.copy-button {\n background: var(--bg-secondary);\n border: 1px solid var(--border-primary);\n color: var(--text-secondary);\n padding: var(--spacing-xs);\n border-radius: var(--radius-sm);\n cursor: pointer;\n transition: all var(--transition-fast);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.copy-button:hover {\n background-color: var(--bg-hover);\n color: var(--text-primary);\n border-color: var(--accent-primary);\n}\n\n.copy-button:active {\n transform: scale(0.95);\n}\n\n/* Copy Success Feedback */\n.copy-button.copied {\n background-color: var(--accent-success);\n border-color: var(--accent-success);\n color: white;\n}\n\n.copy-button.copied::after {\n content: '✓';\n position: absolute;\n font-size: var(--font-size-xs);\n}\n\n.copy-button.copied svg {\n opacity: 0;\n}\n\n/* Data Schema Section Styling */\n.data-schema-section {\n margin-top: var(--spacing-md);\n margin-bottom: 0;\n padding: var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-secondary);\n border-radius: var(--radius-md);\n}\n\n.data-schema-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-md);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n font-size: var(--font-size-sm);\n}\n\n.schema-links {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-sm);\n margin-bottom: var(--spacing-md);\n}\n\n.schema-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--bg-secondary);\n color: var(--text-link);\n text-decoration: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n font-size: var(--font-size-xs);\n font-family: var(--font-family-mono);\n transition: all var(--transition-fast);\n}\n\n.schema-link:hover {\n background-color: var(--bg-hover);\n border-color: var(--accent-primary);\n color: var(--text-link-hover);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.schema-link:active {\n transform: translateY(0);\n}\n\n.schema-link-icon {\n font-size: 0.75rem;\n opacity: 0.7;\n}\n\n.schema-link-name {\n font-weight: var(--font-weight-medium);\n}\n\n.schema-links-note {\n color: var(--text-secondary);\n font-size: var(--font-size-xs);\n font-style: italic;\n margin-bottom: 0;\n}\n\n.schema-links-note small {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n\n/* Responsive schema links */\n@media (max-width: 768px) {\n .schema-links {\n flex-direction: column;\n }\n \n .schema-link {\n justify-content: flex-start;\n padding: var(--spacing-sm);\n }\n}",""]);const s=i},142(e,n,t){t.d(n,{A:()=>s});var r=t(601),a=t.n(r),o=t(314),i=t.n(o)()(a());i.push([e.id,"/* Main CSS for Polkadot REST API Documentation - Dark Theme */\n\n/* CSS Custom Properties for Dark Theme */\n:root {\n /* Color Palette - GitHub Dark Inspired */\n --bg-primary: #0d1117;\n --bg-secondary: #161b22;\n --bg-tertiary: #21262d;\n --bg-overlay: rgba(13, 17, 23, 0.8);\n --bg-hover: #30363d;\n --bg-active: #282e33;\n \n /* Borders */\n --border-primary: #30363d;\n --border-secondary: #21262d;\n --border-focus: #58a6ff;\n \n /* Text Colors */\n --text-primary: #f0f6fc;\n --text-secondary: #8b949e;\n --text-tertiary: #6e7681;\n --text-link: #58a6ff;\n --text-link-hover: #79c0ff;\n --text-inverse: #24292f;\n \n /* Accent Colors */\n --accent-primary: #58a6ff;\n --accent-success: #3fb950;\n --accent-warning: #d29922;\n --accent-danger: #f85149;\n \n /* HTTP Method Colors */\n --method-get: #3fb950;\n --method-post: #d29922;\n --method-put: #58a6ff;\n --method-delete: #f85149;\n --method-patch: #a5a5a5;\n --method-head: #6f42c1;\n --method-options: #8b949e;\n \n /* Status Code Colors */\n --status-success: #3fb950;\n --status-redirect: #58a6ff;\n --status-client-error: #d29922;\n --status-server-error: #f85149;\n \n /* Shadows */\n --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n \n /* Typography */\n --font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n --font-family-mono: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;\n \n --font-size-xs: 0.75rem;\n --font-size-sm: 0.875rem;\n --font-size-base: 1rem;\n --font-size-lg: 1.125rem;\n --font-size-xl: 1.25rem;\n --font-size-2xl: 1.5rem;\n --font-size-3xl: 1.875rem;\n --font-size-4xl: 2.25rem;\n \n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n \n --line-height-tight: 1.25;\n --line-height-normal: 1.5;\n --line-height-relaxed: 1.625;\n \n /* Spacing */\n --spacing-xs: 0.25rem;\n --spacing-sm: 0.5rem;\n --spacing-md: 0.75rem;\n --spacing-lg: 1rem;\n --spacing-xl: 1.25rem;\n --spacing-2xl: 1.5rem;\n --spacing-3xl: 2rem;\n --spacing-4xl: 2.5rem;\n --spacing-5xl: 3rem;\n \n /* Border Radius */\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n \n /* Layout */\n --sidebar-width: 340px;\n --header-height: 64px;\n \n /* Transitions */\n --transition-fast: 150ms ease-in-out;\n --transition-normal: 200ms ease-in-out;\n --transition-slow: 300ms ease-in-out;\n}\n\n/* Light theme overrides (future feature) */\n[data-theme=\"light\"] {\n --bg-primary: #ffffff;\n --bg-secondary: #f6f8fa;\n --bg-tertiary: #ffffff;\n --bg-hover: #f3f4f6;\n --bg-active: #e5e7eb;\n \n --border-primary: #d0d7de;\n --border-secondary: #d8dee4;\n \n --text-primary: #24292f;\n --text-secondary: #656d76;\n --text-tertiary: #8b949e;\n --text-inverse: #f0f6fc;\n}\n\n/* Reset and Base Styles */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nhtml {\n font-size: 16px;\n scroll-behavior: smooth;\n}\n\nbody {\n font-family: var(--font-family-sans);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n line-height: var(--line-height-normal);\n color: var(--text-primary);\n background-color: var(--bg-primary);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n overflow-x: hidden;\n}\n\n/* Typography */\nh1, h2, h3, h4, h5, h6 {\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-tight);\n margin-bottom: var(--spacing-md);\n color: var(--text-primary);\n}\n\nh1 { font-size: var(--font-size-3xl); }\nh2 { font-size: var(--font-size-2xl); }\nh3 { font-size: var(--font-size-xl); }\nh4 { font-size: var(--font-size-lg); }\nh5 { font-size: var(--font-size-base); }\nh6 { font-size: var(--font-size-sm); }\n\np {\n margin-bottom: var(--spacing-lg);\n color: var(--text-secondary);\n}\n\na {\n color: var(--text-link);\n text-decoration: none;\n transition: color var(--transition-fast);\n}\n\na:hover {\n color: var(--text-link-hover);\n text-decoration: underline;\n}\n\ncode {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n padding: 0.125rem 0.25rem;\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-sm);\n color: var(--text-primary);\n}\n\npre {\n font-family: var(--font-family-mono);\n font-size: var(--font-size-sm);\n line-height: var(--line-height-relaxed);\n padding: var(--spacing-lg);\n background-color: var(--bg-tertiary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n overflow-x: auto;\n color: var(--text-primary);\n}\n\npre code {\n padding: 0;\n background: none;\n border: none;\n font-size: inherit;\n}\n\nstrong {\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\nem {\n font-style: italic;\n color: var(--text-secondary);\n}\n\n/* Loading Screen */\n.loading-screen {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--bg-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n}\n\n.loading-spinner {\n text-align: center;\n}\n\n.spinner {\n width: 48px;\n height: 48px;\n border: 3px solid var(--border-primary);\n border-top: 3px solid var(--accent-primary);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto var(--spacing-lg);\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.loading-spinner p {\n color: var(--text-secondary);\n margin: 0;\n}\n\n/* App Container */\n.app {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n}\n\n/* Header */\n.header {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: var(--header-height);\n background-color: var(--bg-secondary);\n border-bottom: 1px solid var(--border-primary);\n z-index: 1000;\n}\n\n.header-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n padding: 0 var(--spacing-lg);\n max-width: 100%;\n}\n\n.header-brand {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n min-width: 0;\n}\n\n.logo {\n flex-shrink: 0;\n}\n\n.brand-text {\n min-width: 0;\n}\n\n.brand-title {\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n margin: 0;\n color: var(--text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.brand-subtitle {\n font-size: var(--font-size-sm);\n color: var(--text-tertiary);\n white-space: nowrap;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: var(--spacing-md);\n flex-shrink: 0;\n}\n\n/* Search */\n.search-container {\n position: relative;\n}\n\n.search-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-input {\n width: 300px;\n height: 40px;\n padding: 0 var(--spacing-lg) 0 40px;\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n color: var(--text-primary);\n font-size: var(--font-size-sm);\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n}\n\n.search-input:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.1);\n}\n\n.search-input::placeholder {\n color: var(--text-tertiary);\n}\n\n.search-icon {\n position: absolute;\n left: var(--spacing-md);\n color: var(--text-tertiary);\n pointer-events: none;\n z-index: 1;\n}\n\n.search-clear {\n position: absolute;\n right: var(--spacing-sm);\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n color: var(--text-tertiary);\n cursor: pointer;\n border-radius: var(--radius-sm);\n transition: all var(--transition-fast);\n}\n\n.search-clear:hover {\n color: var(--text-secondary);\n background-color: var(--bg-hover);\n}\n\n/* Theme Toggle */\n.theme-toggle {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n color: var(--text-secondary);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.theme-toggle:hover {\n color: var(--text-primary);\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n}\n\n/* Mobile Menu Toggle */\n.menu-toggle {\n display: none;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 40px;\n height: 40px;\n background: none;\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-lg);\n cursor: pointer;\n transition: all var(--transition-fast);\n}\n\n.menu-toggle span {\n display: block;\n width: 18px;\n height: 2px;\n background-color: var(--text-secondary);\n margin: 2px 0;\n transition: all var(--transition-fast);\n}\n\n.menu-toggle:hover {\n background-color: var(--bg-hover);\n border-color: var(--border-secondary);\n}\n\n.menu-toggle:hover span {\n background-color: var(--text-primary);\n}\n\n.menu-toggle.active span:nth-child(1) {\n transform: rotate(45deg) translate(5px, 5px);\n}\n\n.menu-toggle.active span:nth-child(2) {\n opacity: 0;\n}\n\n.menu-toggle.active span:nth-child(3) {\n transform: rotate(-45deg) translate(7px, -6px);\n}\n\n/* Main Layout */\n.main-layout {\n display: flex;\n margin-top: var(--header-height);\n min-height: calc(100vh - var(--header-height));\n}\n\n/* Sidebar */\n.sidebar {\n position: fixed;\n top: var(--header-height);\n left: 0;\n width: var(--sidebar-width);\n height: calc(100vh - var(--header-height));\n background-color: var(--bg-secondary);\n border-right: 1px solid var(--border-primary);\n overflow-y: auto;\n z-index: 999;\n transform: translateX(0);\n transition: transform var(--transition-normal);\n}\n\n.sidebar-content {\n padding: var(--spacing-xl) 0;\n}\n\n/* API Info */\n.api-info {\n padding: 0 var(--spacing-xl);\n margin-bottom: var(--spacing-2xl);\n}\n\n.api-version {\n display: inline-block;\n padding: var(--spacing-xs) var(--spacing-sm);\n background-color: var(--accent-primary);\n color: var(--text-inverse);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n border-radius: var(--radius-sm);\n margin-bottom: var(--spacing-md);\n}\n\n.api-description {\n font-size: var(--font-size-sm);\n color: var(--text-tertiary);\n line-height: var(--line-height-relaxed);\n}\n\n/* Server Selector */\n.server-selector {\n padding: 0 var(--spacing-xl);\n margin-bottom: var(--spacing-2xl);\n}\n\n.server-label {\n display: block;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--text-secondary);\n margin-bottom: var(--spacing-sm);\n}\n\n.server-select {\n width: 100%;\n padding: var(--spacing-sm) var(--spacing-md);\n background-color: var(--bg-primary);\n border: 1px solid var(--border-primary);\n border-radius: var(--radius-md);\n color: var(--text-primary);\n font-size: var(--font-size-sm);\n cursor: pointer;\n transition: border-color var(--transition-fast);\n}\n\n.server-select:focus {\n outline: none;\n border-color: var(--border-focus);\n}\n\n/* Main Content */\n.main-content {\n flex: 1;\n margin-left: var(--sidebar-width);\n padding: var(--spacing-2xl);\n overflow-y: auto;\n transition: margin-left var(--transition-normal);\n}\n\n/* Content Container */\n.content-container {\n max-width: 1024px;\n margin: 0 auto;\n}\n\n/* Responsive Design */\n@media (max-width: 1024px) {\n .search-input {\n width: 250px;\n }\n}\n\n@media (max-width: 768px) {\n .header-content {\n padding: 0 var(--spacing-md);\n }\n \n .brand-subtitle {\n display: none;\n }\n \n .search-input {\n width: 200px;\n }\n \n .menu-toggle {\n display: flex;\n }\n \n .sidebar {\n transform: translateX(-100%);\n }\n \n .sidebar.mobile-open {\n transform: translateX(0);\n }\n \n .main-content {\n margin-left: 0;\n padding: var(--spacing-lg);\n }\n}\n\n@media (max-width: 640px) {\n .header-controls {\n gap: var(--spacing-sm);\n }\n \n .search-input {\n width: 180px;\n }\n \n .main-content {\n padding: var(--spacing-md);\n }\n}\n\n/* Utility Classes */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.flex {\n display: flex;\n}\n\n.items-center {\n align-items: center;\n}\n\n.justify-between {\n justify-content: space-between;\n}\n\n.gap-2 {\n gap: var(--spacing-sm);\n}\n\n.gap-4 {\n gap: var(--spacing-lg);\n}\n\n/* Focus Styles */\n*:focus {\n outline: none;\n}\n\n*:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}",""]);const s=i},91(e,n,t){t.d(n,{A:()=>s});var r=t(601),a=t.n(r),o=t(314),i=t.n(o)()(a());i.push([e.id,"/* Responsive design styles for Polkadot REST API Documentation */\n\n/* Large screens (1200px and up) */\n@media (min-width: 1200px) {\n .content-container {\n max-width: 1200px;\n }\n \n .search-input {\n width: 350px;\n }\n \n .features-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n/* Medium screens (768px to 1023px) */\n@media (max-width: 1023px) {\n :root {\n --sidebar-width: 260px;\n }\n \n .header-content {\n padding: 0 var(--spacing-lg);\n }\n \n .search-input {\n width: 240px;\n }\n \n .main-content {\n padding: var(--spacing-xl);\n }\n \n .endpoint-title {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-md);\n }\n \n .parameter-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .response-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-sm);\n }\n \n /* Header responsive for medium screens */\n .section-header h1 {\n font-size: var(--font-size-3xl);\n }\n}\n\n/* Tablet screens (768px to 1023px) */\n@media (max-width: 1023px) and (min-width: 768px) {\n .features-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n \n .search-item-header {\n flex-wrap: wrap;\n }\n \n .nav-group-header {\n padding: var(--spacing-sm) var(--spacing-lg);\n }\n \n .nav-link {\n padding: var(--spacing-sm) var(--spacing-lg);\n }\n}\n\n/* Small tablet and large mobile (640px to 767px) */\n@media (max-width: 767px) {\n .menu-toggle {\n display: flex;\n }\n \n .sidebar {\n transform: translateX(-100%);\n width: 100%;\n max-width: 320px;\n box-shadow: var(--shadow-xl);\n }\n \n .sidebar.mobile-open {\n transform: translateX(0);\n }\n \n .main-content {\n margin-left: 0;\n padding: var(--spacing-lg);\n }\n \n .header-content {\n padding: 0 var(--spacing-md);\n }\n \n .search-input {\n width: 200px;\n }\n \n .brand-subtitle {\n display: none;\n }\n \n .features-grid {\n grid-template-columns: 1fr;\n gap: var(--spacing-xl);\n }\n \n .feature-card {\n padding: var(--spacing-xl);\n }\n \n .section-header {\n margin-bottom: var(--spacing-xl);\n padding-bottom: var(--spacing-md);\n }\n \n .endpoint-title h2 {\n font-size: var(--font-size-xl);\n word-break: break-word;\n }\n \n .parameter-table {\n overflow-x: auto;\n }\n \n .parameter-row {\n padding: var(--spacing-md);\n }\n \n .code-block {\n font-size: var(--font-size-xs);\n }\n \n .search-results {\n position: fixed;\n top: var(--header-height);\n left: 0;\n right: 0;\n border-radius: 0;\n max-height: calc(100vh - var(--header-height));\n }\n \n .breadcrumb-list {\n flex-wrap: wrap;\n }\n \n .nav-subitem .nav-link {\n padding-left: var(--spacing-md);\n }\n}\n\n/* Mobile screens (480px to 639px) */\n@media (max-width: 639px) {\n .header-controls {\n gap: var(--spacing-sm);\n }\n \n .search-input {\n width: 160px;\n font-size: var(--font-size-sm);\n }\n \n .main-content {\n padding: var(--spacing-md);\n }\n \n .content-container {\n margin: 0;\n }\n \n .section-header {\n margin-bottom: var(--spacing-lg);\n }\n \n .endpoint-title {\n gap: var(--spacing-sm);\n }\n \n .method-badge.large {\n padding: 0.25rem 0.375rem;\n min-width: 2.5rem;\n font-size: var(--font-size-xs);\n }\n \n .endpoint-title h2 {\n font-size: var(--font-size-lg);\n }\n \n .parameters-section,\n .responses-section,\n .example-section,\n .example-request-section {\n margin-bottom: var(--spacing-2xl);\n }\n \n .parameter-row {\n padding: var(--spacing-sm);\n }\n \n .parameter-header {\n margin-bottom: var(--spacing-xs);\n }\n \n .response-item {\n margin-bottom: var(--spacing-md);\n }\n \n .response-header {\n padding: var(--spacing-md);\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .code-header,\n .example-header {\n padding: var(--spacing-sm) var(--spacing-md);\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .copy-button {\n padding: var(--spacing-xs);\n font-size: var(--font-size-xs);\n }\n \n .api-info {\n padding: 0 var(--spacing-md);\n }\n \n .server-selector {\n padding: 0 var(--spacing-md);\n }\n \n .nav-group-header {\n padding: var(--spacing-sm) var(--spacing-md);\n }\n \n .nav-link {\n padding: var(--spacing-sm) var(--spacing-md);\n font-size: var(--font-size-xs);\n }\n \n .nav-section-header {\n padding: 0 var(--spacing-md) var(--spacing-sm);\n }\n \n .search-item {\n padding: var(--spacing-sm);\n }\n \n .search-item-header {\n margin-bottom: var(--spacing-xs);\n }\n \n .search-item-tags {\n margin-top: var(--spacing-xs);\n }\n}\n\n/* Very small mobile screens (up to 479px) */\n@media (max-width: 479px) {\n .header-content {\n padding: 0 var(--spacing-sm);\n }\n \n .search-input {\n width: 140px;\n }\n \n .brand-title {\n font-size: var(--font-size-base);\n }\n \n .main-content {\n padding: var(--spacing-sm);\n }\n \n .endpoint-title h2 {\n font-size: var(--font-size-base);\n word-break: break-all;\n }\n \n .method-badge.large {\n padding: 0.125rem 0.25rem;\n min-width: 2rem;\n font-size: var(--font-size-xs);\n }\n \n .features-grid {\n gap: var(--spacing-lg);\n }\n \n .feature-card {\n padding: var(--spacing-lg);\n }\n \n .feature-icon {\n font-size: 1.5rem;\n margin-bottom: var(--spacing-md);\n }\n \n .sidebar {\n max-width: 280px;\n }\n \n .api-info {\n padding: 0 var(--spacing-sm);\n margin-bottom: var(--spacing-xl);\n }\n \n .server-selector {\n padding: 0 var(--spacing-sm);\n margin-bottom: var(--spacing-xl);\n }\n \n .nav-group-header {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .nav-link {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .nav-section-header {\n padding: 0 var(--spacing-sm) var(--spacing-sm);\n }\n \n .nav-subitem .nav-link {\n padding-left: var(--spacing-lg);\n }\n \n .parameter-row {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .code-header,\n .example-header {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .response-header {\n padding: var(--spacing-xs) var(--spacing-sm);\n }\n \n .schema-definition {\n padding: var(--spacing-md);\n }\n \n .search-results-content {\n padding: var(--spacing-md);\n }\n \n .search-no-results {\n padding: var(--spacing-2xl) var(--spacing-lg);\n }\n \n .no-results-icon {\n font-size: 2rem;\n margin-bottom: var(--spacing-md);\n }\n}\n\n/* Landscape phone orientation */\n@media (max-height: 600px) and (orientation: landscape) {\n .loading-screen {\n padding: var(--spacing-lg);\n }\n \n .sidebar {\n height: calc(100vh - var(--header-height));\n overflow-y: auto;\n }\n \n .search-results {\n max-height: 200px;\n }\n \n .nav-group-header {\n padding: var(--spacing-xs) var(--spacing-lg);\n }\n \n .nav-link {\n padding: var(--spacing-xs) var(--spacing-lg);\n }\n \n .api-info {\n margin-bottom: var(--spacing-lg);\n }\n \n .server-selector {\n margin-bottom: var(--spacing-lg);\n }\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n :root {\n --bg-primary: #000000;\n --bg-secondary: #1a1a1a;\n --bg-tertiary: #2d2d2d;\n --text-primary: #ffffff;\n --text-secondary: #e0e0e0;\n --border-primary: #555555;\n --accent-primary: #66b3ff;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n \n .spinner {\n animation: none;\n }\n}\n\n/* Print styles */\n@media print {\n .header,\n .sidebar,\n .search-results,\n .copy-button,\n .theme-toggle,\n .menu-toggle {\n display: none !important;\n }\n \n .main-content {\n margin-left: 0 !important;\n padding: 0 !important;\n }\n \n .content-section {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n \n .endpoint-section {\n page-break-after: always;\n }\n \n body {\n background: white !important;\n color: black !important;\n }\n \n .code-block {\n border: 1px solid #000;\n background: #f5f5f5 !important;\n }\n}\n\n/* Focus management for keyboard navigation */\n@media (any-hover: none) {\n .nav-link:focus,\n .search-item:focus,\n .copy-button:focus {\n outline: 2px solid var(--accent-primary);\n outline-offset: 2px;\n }\n}\n\n/* Touch device optimizations */\n@media (any-hover: none) {\n .nav-link,\n .search-item,\n .copy-button,\n .theme-toggle {\n min-height: 44px;\n }\n \n .nav-group-header {\n min-height: 44px;\n }\n \n .section-toggle {\n min-width: 44px;\n min-height: 44px;\n }\n}\n\n/* Container queries for modern browsers */\n@supports (container-type: inline-size) {\n .search-container {\n container-type: inline-size;\n }\n \n @container (max-width: 300px) {\n .search-input {\n width: 100%;\n }\n }\n \n .parameter-table {\n container-type: inline-size;\n }\n \n @container (max-width: 500px) {\n .parameter-header {\n flex-direction: column;\n align-items: flex-start;\n }\n }\n}\n\n/* API Explorer Responsive Styles */\n@media (max-width: 1023px) {\n .explorer-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-md);\n }\n \n .try-button {\n width: 100%;\n justify-content: center;\n }\n \n .url-display {\n flex-wrap: wrap;\n }\n \n .request-url {\n min-width: 200px;\n }\n \n .response-tabs {\n flex-wrap: wrap;\n }\n \n .tab-button {\n flex: 1 1 auto;\n min-width: 120px;\n }\n}\n\n@media (max-width: 767px) {\n .explorer-content {\n padding: var(--spacing-lg);\n }\n \n .config-section {\n margin-bottom: var(--spacing-xl);\n }\n \n .parameter-label {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .header-row,\n .custom-header-row {\n flex-direction: column;\n align-items: stretch;\n }\n \n .add-header-button,\n .remove-header-button {\n align-self: flex-end;\n margin-top: var(--spacing-sm);\n }\n \n .section-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-sm);\n }\n \n .response-meta {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs);\n }\n \n .tab-content {\n padding: var(--spacing-md);\n }\n \n .error-content {\n flex-direction: column;\n }\n \n .error-icon {\n align-self: flex-start;\n }\n}\n\n@media (max-width: 479px) {\n .explorer-content {\n padding: var(--spacing-md);\n }\n \n .url-display {\n flex-direction: column;\n }\n \n .request-url {\n min-width: auto;\n width: 100%;\n }\n \n .copy-url-button {\n align-self: flex-end;\n }\n \n .json-input {\n min-height: 150px;\n }\n \n .response-tabs {\n flex-direction: column;\n }\n \n .tab-button {\n flex: none;\n border-bottom: none;\n border-right: 2px solid transparent;\n }\n \n .tab-button.active {\n border-bottom: none;\n border-right-color: var(--accent-primary);\n }\n \n .loading-state {\n padding: var(--spacing-2xl);\n }\n \n .loading-spinner {\n flex-direction: column;\n text-align: center;\n gap: var(--spacing-md);\n }\n \n /* Responsive header */\n .section-header {\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-lg);\n text-align: left;\n }\n \n .section-meta {\n align-self: stretch;\n justify-content: flex-end;\n }\n}",""]);const s=i},314(e){e.exports=function(e){var n=[];return n.toString=function(){return this.map(function(n){var t="",r=void 0!==n[5];return n[4]&&(t+="@supports (".concat(n[4],") {")),n[2]&&(t+="@media ".concat(n[2]," {")),r&&(t+="@layer".concat(n[5].length>0?" ".concat(n[5]):""," {")),t+=e(n),r&&(t+="}"),n[2]&&(t+="}"),n[4]&&(t+="}"),t}).join("")},n.i=function(e,t,r,a,o){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var s=0;s0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=o),t&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=t):d[2]=t),a&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=a):d[4]="".concat(a)),n.push(d))}},n}},601(e){e.exports=function(e){return e[1]}},72(e){var n=[];function t(e){for(var t=-1,r=0;r0?" ".concat(t.layer):""," {")),r+=t.css,a&&(r+="}"),t.media&&(r+="}"),t.supports&&(r+="}");var o=t.sourceMap;o&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),n.styleTagTransform(r,e,n.options)}(n,e,t)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(n)}}}},113(e){e.exports=function(e,n){if(n.styleSheet)n.styleSheet.cssText=e;else{for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(document.createTextNode(e))}}}},n={};function t(r){var a=n[r];if(void 0!==a)return a.exports;var o=n[r]={id:r,exports:{}};return e[r](o,o.exports,t),o.exports}t.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return t.d(n,{a:n}),n},t.d=(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},t.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),t.nc=void 0;var r=t(72),a=t.n(r),o=t(825),i=t.n(o),s=t(659),c=t.n(s),l=t(56),d=t.n(l),p=t(540),u=t.n(p),m=t(113),h=t.n(m),g=t(142),f={};f.styleTagTransform=h(),f.setAttributes=d(),f.insert=c().bind(null,"head"),f.domAPI=i(),f.insertStyleElement=u(),a()(g.A,f),g.A&&g.A.locals&&g.A.locals;var v=t(365),y={};y.styleTagTransform=h(),y.setAttributes=d(),y.insert=c().bind(null,"head"),y.domAPI=i(),y.insertStyleElement=u(),a()(v.A,y),v.A&&v.A.locals&&v.A.locals;var b=t(91),x={};x.styleTagTransform=h(),x.setAttributes=d(),x.insert=c().bind(null,"head"),x.domAPI=i(),x.insertStyleElement=u(),a()(b.A,x),b.A&&b.A.locals&&b.A.locals;const k=JSON.parse('{"openapi":"3.1.0","info":{"title":"Polkadot REST API","description":"High-performance Rust REST API for Substrate/Polkadot blockchain data. Drop-in replacement for substrate-api-sidecar.","contact":{"url":"https://github.com/paritytech/polkadot-rest-api"},"license":{"name":"GPL-3.0-or-later"},"version":"0.1.1"},"servers":[{"url":"http://localhost:8080/v1","description":"Localhost"}],"paths":{"/v1/accounts/compare":{"get":{"tags":["accounts"],"summary":"Compare account addresses","description":"Compares multiple SS58 addresses to determine if they have the same underlying public key.","operationId":"get_compare","parameters":[{"name":"addresses","in":"query","description":"Comma-separated list of SS58 addresses to compare (max 30)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Comparison result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCompareResponse"}}}},"400":{"description":"Invalid parameters"}}}},"/v1/accounts/{accountId}/asset-approvals":{"get":{"tags":["accounts"],"summary":"Account asset approvals","description":"Returns asset approval information for a given account, asset, and delegate.","operationId":"get_asset_approvals","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"assetId","in":"query","description":"The asset ID to query approval for","required":true,"schema":{"type":"string"}},{"name":"delegate","in":"query","description":"The delegate address with spending approval","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Asset approval information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetApprovalResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/asset-balances":{"get":{"tags":["accounts"],"summary":"Account asset balances","description":"Returns asset balances for a given account on Asset Hub chains.","operationId":"get_asset_balances","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"assets","in":"query","description":"Comma-separated list of asset IDs to query","required":false,"schema":{"type":"string"}},{"name":"showEmpty","in":"query","description":"When true, include assets with zero balance (default: false)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Account asset balances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetBalancesResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/balance-info":{"get":{"tags":["accounts"],"summary":"Account balance info","description":"Returns balance information for a given account including free, reserved, and locked balances.","operationId":"get_balance_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"token","in":"query","description":"Token symbol for chains with multiple tokens","required":false,"schema":{"type":"string"}},{"name":"denominated","in":"query","description":"When true, denominate balances using chain decimals","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Account balance information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceInfoResponse"}}}},"400":{"description":"Invalid account or block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/convert":{"get":{"tags":["accounts"],"summary":"Convert account format","description":"Converts an account address between different SS58 formats and key types.","operationId":"get_convert","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address or hex public key","required":true,"schema":{"type":"string"}},{"name":"scheme","in":"query","description":"Cryptographic scheme: ed25519, sr25519, or ecdsa (default: sr25519)","required":false,"schema":{"type":"string"}},{"name":"prefix","in":"query","description":"SS58 prefix number (default: 42)","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"publicKey","in":"query","description":"If true, treat input as a public key","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Converted account information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountConvertResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/foreign-asset-balances":{"get":{"tags":["accounts"],"summary":"Account foreign asset balances","description":"Returns foreign asset balances for a given account on Asset Hub chains. Foreign assets use XCM MultiLocation as their identifier.","operationId":"get_foreign_asset_balances","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"foreignAssets","in":"query","description":"List of multilocation JSON strings to filter by","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"showEmpty","in":"query","description":"When true, include assets with zero balance (default: false)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Foreign asset balances","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid account or parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/pool-asset-approvals":{"get":{"tags":["accounts"],"summary":"Account pool asset approvals","description":"Returns pool asset approval information for a given account, asset, and delegate.","operationId":"get_pool_asset_approvals","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"assetId","in":"query","description":"The pool asset ID to query approval for","required":true,"schema":{"type":"string"}},{"name":"delegate","in":"query","description":"The delegate address with spending approval","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Pool asset approval information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolAssetApprovalResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/pool-asset-balances":{"get":{"tags":["accounts"],"summary":"Account pool asset balances","description":"Returns pool asset balances for a given account.","operationId":"get_pool_asset_balances","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"assets","in":"query","description":"Comma-separated list of pool asset IDs to query","required":false,"schema":{"type":"string"}},{"name":"showEmpty","in":"query","description":"When true, include assets with zero balance (default: false)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pool asset balances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolAssetBalancesResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/proxy-info":{"get":{"tags":["accounts"],"summary":"Account proxy info","description":"Returns proxy information for a given account including delegated proxies and their types.","operationId":"get_proxy_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Proxy information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyInfoResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/staking-info":{"get":{"tags":["accounts"],"summary":"Account staking info","description":"Returns staking information for a given stash account including bonded amount, controller, and nominations.","operationId":"get_staking_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded stash account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"includeClaimedRewards","in":"query","description":"When true, include claimed rewards in the response","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StakingInfoResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/staking-payouts":{"get":{"tags":["accounts"],"summary":"Account staking payouts","description":"Returns staking payout history for a given account including era rewards and claimed status.","operationId":"get_staking_payouts","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded stash account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"depth","in":"query","description":"Number of eras to query (default: 1)","required":false,"schema":{"type":"string"}},{"name":"era","in":"query","description":"The era to query at (default: active_era - 1)","required":false,"schema":{"type":"string"}},{"name":"unclaimedOnly","in":"query","description":"Only show unclaimed rewards (default: true)","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking payout information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StakingPayoutsResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/accounts/{accountId}/validate":{"get":{"tags":["accounts"],"summary":"Validate account address","description":"Validates an SS58-encoded account address and returns details about its format.","operationId":"get_validate","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address to validate","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number (accepted for API consistency)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Validation result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountValidateResponse"}}}}}}},"/v1/accounts/{accountId}/vesting-info":{"get":{"tags":["accounts"],"summary":"Account vesting info","description":"Returns vesting information for a given account including vesting schedules and locked amounts.","operationId":"get_vesting_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}},{"name":"includeClaimable","in":"query","description":"When true, calculate vested amounts","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Vesting information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VestingInfoResponse"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/ahm-info":{"get":{"tags":["ahm"],"summary":"Asset Hub Migration info","description":"Returns information about the Asset Hub migration, including start and end blocks for both relay chain and Asset Hub.","operationId":"ahm_info","responses":{"200":{"description":"AHM migration boundaries","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No migration data available"}}}},"/v1/blocks":{"get":{"tags":["blocks"],"summary":"Get blocks by range","description":"Returns a collection of blocks given a numeric range. Range is inclusive and limited to 500 blocks.","operationId":"get_blocks","parameters":[{"name":"range","in":"query","description":"Block range in format \'start-end\' (e.g. \'100-200\')","required":false,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include documentation for events","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include documentation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat range as Relay Chain blocks","required":false,"schema":{"type":"boolean"}},{"name":"useEvmFormat","in":"query","description":"Convert AccountId32 addresses to EVM format for revive pallet events","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Array of block information","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}},"400":{"description":"Invalid range parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/head":{"get":{"tags":["blocks"],"summary":"Get latest block","description":"Returns the latest finalized or canonical block with full extrinsic and event details.","operationId":"get_block_head","parameters":[{"name":"finalized","in":"query","description":"When true (default), returns finalized head. When false, returns canonical head.","required":false,"schema":{"type":"boolean"}},{"name":"eventDocs","in":"query","description":"Include documentation for events","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include documentation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Decode and include XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"useRcBlock","in":"query","description":"When true, use relay chain head to find corresponding Asset Hub blocks","required":false,"schema":{"type":"boolean"}},{"name":"useEvmFormat","in":"query","description":"Convert AccountId32 addresses to EVM format for revive pallet events","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Latest block information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/head/header":{"get":{"tags":["blocks"],"summary":"Get head block header","description":"Returns the header of the latest finalized or canonical block (lightweight, no extrinsics/events).","operationId":"get_blocks_head_header","parameters":[{"name":"finalized","in":"query","description":"When true (default), returns finalized head header. When false, returns canonical head header.","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat as Relay Chain block and return Asset Hub blocks","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Block header information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}":{"get":{"tags":["blocks"],"summary":"Get block by ID","description":"Returns block information for a given block identifier (hash or number), including extrinsics, events, and fees.","operationId":"get_block","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include documentation for events","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include documentation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"finalizedKey","in":"query","description":"When true (default), include finalized status in response","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Decode and include XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"useRcBlock","in":"query","description":"Treat blockId as Relay Chain block and return Asset Hub blocks","required":false,"schema":{"type":"boolean"}},{"name":"useEvmFormat","in":"query","description":"Convert AccountId32 addresses to EVM format for revive pallet events","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Block information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}/extrinsics-raw":{"get":{"tags":["blocks"],"summary":"Get raw extrinsics","description":"Returns raw block data with hex-encoded extrinsics for a given block identifier. The extrinsics are returned as raw hex strings without decoding.","operationId":"get_block_extrinsics_raw","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"When true, treat blockId as Relay Chain block and return Asset Hub blocks","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Raw block data with hex-encoded extrinsics","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}/extrinsics/{extrinsicIndex}":{"get":{"tags":["blocks"],"summary":"Get extrinsic by index","description":"Returns a specific extrinsic from a block by its index within the block.","operationId":"get_extrinsic","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"extrinsicIndex","in":"path","description":"Index of the extrinsic within the block","required":true,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include documentation for events","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include documentation for extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"When true, treat blockId as Relay Chain block and return Asset Hub extrinsics","required":false,"schema":{"type":"boolean"}},{"name":"useEvmFormat","in":"query","description":"Convert AccountId32 addresses to EVM format for revive pallet events","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Extrinsic details","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier or extrinsic index"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}/header":{"get":{"tags":["blocks"],"summary":"Get block header by ID","description":"Returns the header of the specified block (lightweight, no extrinsics/events).","operationId":"get_block_header","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat blockId as Relay Chain block and return Asset Hub blocks","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Block header information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/blocks/{blockId}/para-inclusions":{"get":{"tags":["blocks"],"summary":"Get parachain inclusions","description":"Returns parachain inclusion information for a given relay chain block. Extracts CandidateIncluded events from the ParaInclusion pallet.","operationId":"get_block_para_inclusions","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"paraId","in":"query","description":"Filter results by a specific parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Parachain inclusion information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/capabilities":{"get":{"tags":["capabilities"],"summary":"API capabilities","description":"Returns the chain name and list of available pallets in the runtime metadata.","operationId":"get_capabilities","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Chain capabilities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilitiesResponse"}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/info":{"get":{"tags":["coretime"],"summary":"Get coretime info","description":"Returns coretime chain status information including the last committed timeslice.","operationId":"coretime_info","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime info","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/leases":{"get":{"tags":["coretime"],"summary":"Get coretime leases","description":"Returns all leases registered on a coretime chain with task IDs and validity timeslices.","operationId":"coretime_leases","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime leases","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/overview":{"get":{"tags":["coretime"],"summary":"Get coretime overview","description":"Returns an overview of all cores with assignments, queue state, workload, workplan, and regions.","operationId":"coretime_overview","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime overview","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/regions":{"get":{"tags":["coretime"],"summary":"Get coretime regions","description":"Returns all regions on a coretime chain including begin/end timeslices, core, owner, and mask.","operationId":"coretime_regions","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime regions","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/renewals":{"get":{"tags":["coretime"],"summary":"Get coretime potential renewals","description":"Returns potential renewals on a coretime chain sorted by core index, including price, completion status, and task assignment.","operationId":"coretime_renewals","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime renewals","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/coretime/reservations":{"get":{"tags":["coretime"],"summary":"Get coretime reservations","description":"Returns all reservations on a coretime chain. Reserved cores are permanently allocated and not available for sale.","operationId":"coretime_reservations","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Coretime reservations","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/health":{"get":{"tags":["health"],"summary":"Health check","description":"Returns the health status of the API server.","operationId":"get_health","responses":{"202":{"description":"API is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v1/node/network":{"get":{"tags":["node"],"summary":"Node network info","description":"Returns the node\'s network information including peer count, syncing status, and local peer ID.","operationId":"get_node_network","responses":{"200":{"description":"Node network information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/node/transaction-pool":{"get":{"tags":["node"],"summary":"Transaction pool","description":"Returns the node\'s transaction pool with optional fee information.","operationId":"get_node_transaction_pool","parameters":[{"name":"includeFee","in":"query","description":"Include fee details for each transaction","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Transaction pool entries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionPoolResponse"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/node/version":{"get":{"tags":["node"],"summary":"Node version","description":"Returns the node\'s version information including client version, implementation name, and chain name.","operationId":"get_node_version","responses":{"200":{"description":"Node version information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeVersionResponse"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/asset-conversion/liquidity-pools":{"get":{"tags":["pallets"],"summary":"Liquidity pools","description":"Returns all liquidity pools from the AssetConversion pallet.","operationId":"get_liquidity_pools","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Liquidity pools","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/asset-conversion/next-available-id":{"get":{"tags":["pallets"],"summary":"Next available pool ID","description":"Returns the next available pool asset ID from the AssetConversion pallet.","operationId":"get_next_available_id","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Next available ID","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/assets/{assetId}/asset-info":{"get":{"tags":["pallets"],"summary":"Asset info","description":"Returns details for a specific asset including supply, admin, and metadata.","operationId":"pallets_assets_asset_info","parameters":[{"name":"assetId","in":"path","description":"Asset ID","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Asset information","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Asset not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/foreign-assets":{"get":{"tags":["pallets"],"summary":"Foreign assets","description":"Returns all foreign assets with their details and metadata. Foreign assets use XCM MultiLocation as their identifier.","operationId":"pallets_foreign_assets","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Foreign assets list","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Not supported on this chain"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/nomination-pools/info":{"get":{"tags":["pallets"],"summary":"Nomination pools info","description":"Returns global nomination pools statistics and configuration.","operationId":"pallets_nomination_pools_info","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Nomination pools information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Not supported on this chain"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/nomination-pools/{poolId}":{"get":{"tags":["pallets"],"summary":"Nomination pool details","description":"Returns details for a specific nomination pool.","operationId":"pallets_nomination_pools_pool","parameters":[{"name":"poolId","in":"path","description":"Pool ID","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pool details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Pool not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/on-going-referenda":{"get":{"tags":["pallets"],"summary":"On-going referenda","description":"Returns all currently active referenda from the Referenda pallet.","operationId":"pallets_on_going_referenda","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Active referenda","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/pool-assets/{assetId}/asset-info":{"get":{"tags":["pallets"],"summary":"Pool asset info","description":"Returns details for a specific pool asset including supply, admin, and metadata.","operationId":"pallets_pool_assets_asset_info","parameters":[{"name":"assetId","in":"path","description":"Pool asset ID","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pool asset information","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Pool asset not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/staking/progress":{"get":{"tags":["pallets"],"summary":"Staking progress","description":"Returns staking progress including era, session info, and validator counts.","operationId":"pallets_staking_progress","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking progress information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/staking/validators":{"get":{"tags":["pallets"],"summary":"Staking validators","description":"Returns the list of active validators and their info.","operationId":"pallets_staking_validators","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Validator information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/consts":{"get":{"tags":["pallets"],"summary":"Pallet constants","description":"Returns all constants defined in a pallet.","operationId":"pallets_constants","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return constant names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet constants","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/consts/{constantItemId}":{"get":{"tags":["pallets"],"summary":"Pallet constant value","description":"Returns the value and metadata of a specific constant in a pallet.","operationId":"pallets_constant_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"constantItemId","in":"path","description":"Name of the constant","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Constant value","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"404":{"description":"Constant not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/dispatchables":{"get":{"tags":["pallets"],"summary":"Pallet dispatchables","description":"Returns the dispatchable calls defined in a pallet.","operationId":"get_pallets_dispatchables","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return dispatchable names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet dispatchables","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/dispatchables/{dispatchableId}":{"get":{"tags":["pallets"],"summary":"Pallet dispatchable details","description":"Returns a single dispatchable call defined in a pallet.","operationId":"get_pallet_dispatchable_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"dispatchableId","in":"path","description":"Name of the dispatchable","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Dispatchable details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Dispatchable not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/errors":{"get":{"tags":["pallets"],"summary":"Pallet errors","description":"Returns all errors defined in a pallet.","operationId":"get_pallet_errors","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return error names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet errors","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/errors/{errorItemId}":{"get":{"tags":["pallets"],"summary":"Pallet error details","description":"Returns metadata for a specific error in a pallet.","operationId":"get_pallet_error_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"errorItemId","in":"path","description":"Name of the error","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Error details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Error not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/events":{"get":{"tags":["pallets"],"summary":"Get pallet events","description":"Returns all events defined in a pallet.","operationId":"get_pallet_events","parameters":[{"name":"palletId","in":"path","description":"Pallet name or index","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return event names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet events","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"404":{"description":"Pallet not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/events/{eventItemId}":{"get":{"tags":["pallets"],"summary":"Get pallet event item","description":"Returns metadata for a specific event in a pallet.","operationId":"get_pallet_event_item","parameters":[{"name":"palletId","in":"path","description":"Pallet name or index","required":true,"schema":{"type":"string"}},{"name":"eventItemId","in":"path","description":"Event name","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include full event metadata","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Event item details","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request"},"404":{"description":"Pallet or event not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/storage":{"get":{"tags":["pallets"],"summary":"Pallet storage items","description":"Returns the list of storage items for a given pallet.","operationId":"get_pallets_storage","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return storage item names","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Pallet storage items","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet or parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/pallets/{palletId}/storage/{storageItemId}":{"get":{"tags":["pallets"],"summary":"Pallet storage item value","description":"Returns the value of a specific storage item in a pallet.","operationId":"get_pallets_storage_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"storageItemId","in":"path","description":"Name of the storage item","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"keys[]","in":"query","description":"Storage key arguments","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"metadata","in":"query","description":"Include metadata for the storage item","required":false,"schema":{"type":"boolean"}},{"name":"useRcBlock","in":"query","description":"Treat \'at\' as relay chain block identifier","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Storage item value","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"404":{"description":"Storage item not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/paras/{number}/inclusion":{"get":{"tags":["paras"],"summary":"Parachain inclusion data","description":"Returns inclusion information for a given parachain block, searching relay chain blocks for when the parachain block was included.","operationId":"get_paras_inclusion","parameters":[{"name":"number","in":"path","description":"Parachain block number","required":true,"schema":{"type":"string"}},{"name":"depth","in":"query","description":"Search depth for relay chain blocks (max 100, default 10, must be divisible by 5)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Parachain inclusion information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/accounts/{accountId}/balance-info":{"get":{"tags":["rc"],"summary":"RC get balance info","description":"Returns balance information for a given account on the relay chain.","operationId":"get_balance_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"token","in":"query","description":"Token symbol (defaults to native token)","required":false,"schema":{"type":"string"}},{"name":"denominated","in":"query","description":"Denominate balances using chain decimals","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Balance information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcBalanceInfoResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/accounts/{accountId}/proxy-info":{"get":{"tags":["rc"],"summary":"RC get proxy info","description":"Returns proxy information for a given account on the relay chain.","operationId":"get_proxy_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Proxy information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcProxyInfoResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/accounts/{accountId}/staking-info":{"get":{"tags":["rc"],"summary":"RC get staking info","description":"Returns staking information for a given stash account on the relay chain.","operationId":"get_staking_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded stash account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"includeClaimedRewards","in":"query","description":"When true, include claimed rewards in the response","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcStakingInfoResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/accounts/{accountId}/staking-payouts":{"get":{"tags":["rc"],"summary":"RC get staking payouts","description":"Returns staking payout information for a given account on the relay chain.","operationId":"get_staking_payouts","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}},{"name":"depth","in":"query","description":"Number of eras to query (default: 1)","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"era","in":"query","description":"The era to query at (default: active_era - 1)","required":false,"schema":{"type":"integer","format":"int32","minimum":0}},{"name":"unclaimedOnly","in":"query","description":"Only show unclaimed rewards (default: true)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Staking payouts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcStakingPayoutsResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/accounts/{accountId}/vesting-info":{"get":{"tags":["rc"],"summary":"RC get vesting info","description":"Returns vesting information for a given account on the relay chain.","operationId":"get_vesting_info","parameters":[{"name":"accountId","in":"path","description":"SS58-encoded account address","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Vesting information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RcVestingInfoResponse"}}}},"400":{"description":"Invalid account address"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks":{"get":{"tags":["rc"],"summary":"RC get blocks by range","description":"Returns relay chain blocks within a specified range (max 500 blocks).","operationId":"get_rc_blocks","parameters":[{"name":"range","in":"query","description":"Block range (e.g., \'100-200\')","required":false,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include event documentation","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include extrinsic documentation","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Decode and include XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Relay chain blocks","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid range or missing parameter"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/head":{"get":{"tags":["rc"],"summary":"RC get head block","description":"Returns the latest block on the relay chain.","operationId":"get_rc_blocks_head","parameters":[{"name":"finalized","in":"query","description":"When true returns finalized head (default: true)","required":false,"schema":{"type":"boolean"}},{"name":"eventDocs","in":"query","description":"Include event documentation","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include extrinsic documentation","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Decode and include XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Relay chain head block","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/head/header":{"get":{"tags":["rc"],"summary":"RC get head block header","description":"Returns the header of the latest relay chain block.","operationId":"get_rc_blocks_head_header","parameters":[{"name":"finalized","in":"query","description":"When true returns finalized head (default: true)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain head block header","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}":{"get":{"tags":["rc"],"summary":"RC get block by ID","description":"Returns relay chain block information for a given block identifier.","operationId":"get_rc_block","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include event documentation","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include extrinsic documentation","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}},{"name":"decodedXcmMsgs","in":"query","description":"Include decoded XCM messages","required":false,"schema":{"type":"boolean"}},{"name":"paraId","in":"query","description":"Filter XCM messages by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Relay chain block information","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}/extrinsics-raw":{"get":{"tags":["rc"],"summary":"RC get raw extrinsics","description":"Returns raw hex-encoded extrinsics for a relay chain block without decoding.","operationId":"get_rc_block_extrinsics_raw","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Raw extrinsics","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}/extrinsics/{extrinsicIndex}":{"get":{"tags":["rc"],"summary":"RC get extrinsic by index","description":"Returns a specific extrinsic from a relay chain block by its index.","operationId":"get_rc_extrinsic","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"extrinsicIndex","in":"path","description":"Index of the extrinsic in the block","required":true,"schema":{"type":"string"}},{"name":"eventDocs","in":"query","description":"Include event documentation","required":false,"schema":{"type":"boolean"}},{"name":"extrinsicDocs","in":"query","description":"Include extrinsic documentation","required":false,"schema":{"type":"boolean"}},{"name":"noFees","in":"query","description":"Skip fee calculation","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Extrinsic details","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block ID or extrinsic index"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}/header":{"get":{"tags":["rc"],"summary":"RC get block header","description":"Returns the header of a relay chain block by block hash or block number.","operationId":"get_rc_block_header","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain block header","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/blocks/{blockId}/para-inclusions":{"get":{"tags":["rc"],"summary":"RC get parachain inclusions","description":"Returns parachain inclusion information for a given relay chain block.","operationId":"get_rc_block_para_inclusions","parameters":[{"name":"blockId","in":"path","description":"Block height number or block hash","required":true,"schema":{"type":"string"}},{"name":"paraId","in":"query","description":"Filter by parachain ID","required":false,"schema":{"type":"integer","format":"int32","minimum":0}}],"responses":{"200":{"description":"Parachain inclusions","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block identifier"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/node/network":{"get":{"tags":["rc"],"summary":"RC get node network","description":"Returns the relay chain node\'s network information.","operationId":"get_rc_node_network","responses":{"200":{"description":"Relay chain node network info","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/node/transaction-pool":{"get":{"tags":["rc"],"summary":"RC get transaction pool","description":"Returns the relay chain\'s transaction pool with optional fee information.","operationId":"get_rc_node_transaction_pool","parameters":[{"name":"includeFee","in":"query","description":"Include fee information for each transaction (default: false)","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain transaction pool","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionPoolResponse"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/node/version":{"get":{"tags":["rc"],"summary":"RC get node version","description":"Returns the relay chain node\'s version information.","operationId":"get_rc_node_version","responses":{"200":{"description":"Relay chain node version","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeVersionResponse"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/pallets/on-going-referenda":{"get":{"tags":["rc"],"summary":"RC on-going referenda","description":"Returns all currently active referenda from the relay chain\'s Referenda pallet.","operationId":"rc_pallets_on_going_referenda","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Active referenda from relay chain","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/staking/progress":{"get":{"tags":["rc"],"summary":"RC staking progress","description":"Returns staking progress from the relay chain.","operationId":"rc_pallets_staking_progress","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain staking progress","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/staking/validators":{"get":{"tags":["rc"],"summary":"RC staking validators","description":"Returns the list of active validators from the relay chain.","operationId":"rc_pallets_staking_validators","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain validator information","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/consts":{"get":{"tags":["rc"],"summary":"RC pallet constants","description":"Returns all constants defined in a relay chain pallet.","operationId":"rc_pallets_constants","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return constant names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet constants","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/consts/{constantItemId}":{"get":{"tags":["rc"],"summary":"RC pallet constant value","description":"Returns the value and metadata of a specific constant from a relay chain pallet.","operationId":"rc_pallets_constant_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"constantItemId","in":"path","description":"Name of the constant","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain constant value","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Constant not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/dispatchables":{"get":{"tags":["rc"],"summary":"RC pallet dispatchables","description":"Returns the dispatchable calls defined in a relay chain pallet.","operationId":"rc_pallets_dispatchables","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return dispatchable names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet dispatchables","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/dispatchables/{dispatchableId}":{"get":{"tags":["rc"],"summary":"RC pallet dispatchable details","description":"Returns a single dispatchable call from a relay chain pallet.","operationId":"rc_pallet_dispatchable_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"dispatchableId","in":"path","description":"Name of the dispatchable","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain dispatchable details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Dispatchable not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/errors":{"get":{"tags":["rc"],"summary":"RC pallet errors","description":"Returns all errors defined in a relay chain pallet.","operationId":"rc_pallet_errors","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return error names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet errors","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/errors/{errorItemId}":{"get":{"tags":["rc"],"summary":"RC pallet error details","description":"Returns metadata for a specific error in a relay chain pallet.","operationId":"rc_pallet_error_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"errorItemId","in":"path","description":"Name of the error","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include metadata","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain error details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Error not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/events":{"get":{"tags":["rc"],"summary":"RC pallet events","description":"Returns all events defined in a relay chain pallet.","operationId":"rc_pallet_events","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return event names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet events","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/events/{eventItemId}":{"get":{"tags":["rc"],"summary":"RC pallet event details","description":"Returns metadata for a specific event in a relay chain pallet.","operationId":"rc_pallet_event_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"eventItemId","in":"path","description":"Event name","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"metadata","in":"query","description":"Include full event metadata","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain event details","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Pallet or event not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/storage":{"get":{"tags":["rc"],"summary":"RC pallet storage items","description":"Returns the list of storage items for a relay chain pallet.","operationId":"rc_get_pallets_storage","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"onlyIds","in":"query","description":"Only return storage item names","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain pallet storage items","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid pallet or parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/pallets/{palletId}/storage/{storageItemId}":{"get":{"tags":["rc"],"summary":"RC pallet storage item value","description":"Returns the value of a specific storage item from a relay chain pallet.","operationId":"rc_get_pallets_storage_item","parameters":[{"name":"palletId","in":"path","description":"Name or index of the pallet","required":true,"schema":{"type":"string"}},{"name":"storageItemId","in":"path","description":"Name of the storage item","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"keys[]","in":"query","description":"Storage key arguments","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"metadata","in":"query","description":"Include metadata for the storage item","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Relay chain storage item value","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"404":{"description":"Storage item not found"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/runtime/code":{"get":{"tags":["rc"],"summary":"RC get runtime code","description":"Returns the Wasm code blob of the relay chain runtime at a given block.","operationId":"get_rc_runtime_code","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain runtime code","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/runtime/metadata":{"get":{"tags":["rc"],"summary":"RC get runtime metadata","description":"Returns the decoded runtime metadata of the relay chain in JSON format.","operationId":"get_rc_runtime_metadata","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain runtime metadata","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/runtime/metadata/versions":{"get":{"tags":["rc"],"summary":"RC get metadata versions","description":"Returns the available metadata versions on the relay chain at a given block.","operationId":"get_rc_runtime_metadata_versions","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Available metadata versions","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/runtime/metadata/{version}":{"get":{"tags":["rc"],"summary":"RC get metadata by version","description":"Returns the relay chain metadata at a specific version (e.g., v14, v15).","operationId":"get_rc_runtime_metadata_versioned","parameters":[{"name":"version","in":"path","description":"Metadata version in \'vX\' format (e.g., v14, v15)","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain metadata at specified version","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid version format"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/runtime/spec":{"get":{"tags":["rc"],"summary":"RC get runtime spec","description":"Returns the runtime spec of the relay chain at a given block.","operationId":"get_rc_runtime_spec","parameters":[{"name":"at","in":"query","description":"Block identifier (number or hash)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain runtime spec","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/transaction":{"post":{"tags":["rc"],"summary":"Submit transaction (relay chain)","description":"Submit a signed extrinsic to the relay chain transaction pool. Only available on parachains.","operationId":"submit_rc","requestBody":{"description":"Signed extrinsic with \'tx\' field containing hex-encoded transaction","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Transaction hash","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Relay chain not configured"}}}},"/v1/rc/transaction/dry-run":{"post":{"tags":["rc"],"summary":"RC dry run transaction","description":"Dry run a transaction on the relay chain.","operationId":"dry_run_rc","requestBody":{"description":"Transaction with \'tx\', \'senderAddress\', and optional \'at\' fields","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Dry run result","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/fee-estimate":{"post":{"tags":["rc"],"summary":"RC fee estimate","description":"Estimate the fee for a relay chain transaction.","operationId":"fee_estimate_rc","requestBody":{"description":"Transaction with \'tx\' field","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Fee estimate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeEstimateResponse"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/material":{"get":{"tags":["rc"],"summary":"RC transaction material","description":"Returns relay chain network information for transaction construction.","operationId":"material_rc","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"noMeta","in":"query","description":"DEPRECATED: If true, metadata is not included","required":false,"schema":{"type":"boolean"}},{"name":"metadata","in":"query","description":"Metadata format: \'json\' or \'scale\'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain transaction material","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/material/{metadataVersion}":{"get":{"tags":["rc"],"summary":"RC transaction material versioned","description":"Returns relay chain transaction material with metadata at a specific version.","operationId":"material_versioned_rc","parameters":[{"name":"metadataVersion","in":"path","description":"Metadata version (e.g., \'v14\', \'v15\')","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"noMeta","in":"query","description":"DEPRECATED: If true, metadata is not included","required":false,"schema":{"type":"boolean"}},{"name":"metadata","in":"query","description":"Metadata format: \'json\' or \'scale\'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Relay chain transaction material with versioned metadata","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/metadata-blob":{"post":{"tags":["rc"],"summary":"RC metadata blob","description":"Generates a metadata blob from the relay chain for transaction signing.","operationId":"metadata_blob_rc","requestBody":{"description":"Request with \'tx\' field and optional \'at\' block","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Metadata blob","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/rc/transaction/parse":{"post":{"tags":["rc"],"summary":"Parse transaction (relay chain)","description":"Decode a raw transaction using relay chain metadata. Only available on parachains. Returns the decoded pallet/method, call arguments, signature info, nonce, tip, era, and hash. Note: This endpoint uses the relay chain\'s current (latest) metadata for decoding. Transactions created for older runtime versions may fail to decode if the extrinsic format has changed.","operationId":"parse_rc","requestBody":{"description":"Transaction with \'tx\' field containing hex-encoded extrinsic","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseRequest"}}},"required":true},"responses":{"200":{"description":"Parsed transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseResponse"}}}},"400":{"description":"Invalid transaction or relay chain not configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseError"}}}},"500":{"description":"Internal server error"},"503":{"description":"Relay chain unavailable"}}}},"/v1/runtime/code":{"get":{"tags":["runtime"],"summary":"Runtime Wasm code","description":"Returns the Wasm code blob of the Substrate runtime at a given block.","operationId":"runtime_code","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Runtime code","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/runtime/metadata":{"get":{"tags":["runtime"],"summary":"Runtime metadata","description":"Returns the decoded runtime metadata in JSON format.","operationId":"runtime_metadata","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Runtime metadata","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/runtime/metadata/versions":{"get":{"tags":["runtime"],"summary":"Available metadata versions","description":"Returns the available metadata versions at a given block.","operationId":"runtime_metadata_versions","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of available metadata versions","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/runtime/metadata/{version}":{"get":{"tags":["runtime"],"summary":"Runtime metadata by version","description":"Returns the metadata at a specific version. The version parameter should be in \'vX\' format (e.g., \'v14\', \'v15\').","operationId":"runtime_metadata_versioned","parameters":[{"name":"version","in":"path","description":"Metadata version (e.g., \'v14\', \'v15\')","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Runtime metadata at specified version","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid version format or block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/runtime/spec":{"get":{"tags":["runtime"],"summary":"Runtime specification","description":"Returns the runtime specification including version, APIs, and chain properties.","operationId":"runtime_spec","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Runtime specification","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid block parameter"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction":{"post":{"tags":["transaction"],"summary":"Submit transaction","description":"Submit a signed extrinsic to the transaction pool.","operationId":"submit","requestBody":{"description":"Signed extrinsic with \'tx\' field containing hex-encoded transaction","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Transaction hash","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/dry-run":{"post":{"tags":["transaction"],"summary":"Dry run transaction","description":"Dry run a transaction to check validity without submitting.","operationId":"dry_run","requestBody":{"description":"Transaction with \'tx\', \'senderAddress\', and optional \'at\' fields","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Dry run result","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/fee-estimate":{"post":{"tags":["transaction"],"summary":"Estimate transaction fee","description":"Estimate the fee for a transaction.","operationId":"fee_estimate","requestBody":{"description":"Transaction with \'tx\' field containing hex-encoded transaction","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Fee estimate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeEstimateResponse"}}}},"400":{"description":"Invalid transaction"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/material":{"get":{"tags":["transaction"],"summary":"Transaction construction material","description":"Returns network information needed for transaction construction including genesis hash, spec version, and optionally metadata.","operationId":"material","parameters":[{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"noMeta","in":"query","description":"DEPRECATED: If true, metadata is not included","required":false,"schema":{"type":"boolean"}},{"name":"metadata","in":"query","description":"Metadata format: \'json\' or \'scale\'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Transaction material","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/material/{metadataVersion}":{"get":{"tags":["transaction"],"summary":"Transaction material with versioned metadata","description":"Returns transaction construction material with metadata at a specific version.","operationId":"material_versioned","parameters":[{"name":"metadataVersion","in":"path","description":"Metadata version (e.g., \'v14\', \'v15\')","required":true,"schema":{"type":"string"}},{"name":"at","in":"query","description":"Block hash or number to query at","required":false,"schema":{"type":"string"}},{"name":"noMeta","in":"query","description":"DEPRECATED: If true, metadata is not included","required":false,"schema":{"type":"boolean"}},{"name":"metadata","in":"query","description":"Metadata format: \'json\' or \'scale\'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Transaction material with versioned metadata","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/metadata-blob":{"post":{"tags":["transaction"],"summary":"Generate metadata blob","description":"Generates a metadata blob for transaction signing with the CheckMetadataHash extension.","operationId":"metadata_blob","requestBody":{"description":"Request with \'tx\' field and optional \'at\' block","content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"description":"Metadata blob","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid parameters"},"500":{"description":"Internal server error"},"503":{"description":"Service unavailable"}}}},"/v1/transaction/parse":{"post":{"tags":["transaction"],"summary":"Parse transaction","description":"Decode a raw transaction and return its components without executing or submitting it. Returns the decoded pallet/method, call arguments, signature info, nonce, tip, era, and hash. Note: This endpoint uses the chain\'s current (latest) metadata for decoding. Transactions created for older runtime versions may fail to decode if the extrinsic format has changed.","operationId":"parse","requestBody":{"description":"Transaction with \'tx\' field containing hex-encoded extrinsic","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseRequest"}}},"required":true},"responses":{"200":{"description":"Parsed transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseResponse"}}}},"400":{"description":"Invalid transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParseError"}}}},"500":{"description":"Internal server error"}}}},"/v1/version":{"get":{"tags":["version"],"summary":"API version","description":"Returns the current version of the Polkadot REST API.","operationId":"get_version","responses":{"200":{"description":"API version","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionResponse"}}}}}}}},"components":{"schemas":{"AccountCompareResponse":{"type":"object","description":"Response for GET /accounts/compare","required":["areEqual","addresses"],"properties":{"addresses":{"type":"array","items":{"$ref":"#/components/schemas/AddressDetails"},"description":"Details for each address"},"areEqual":{"type":"boolean","description":"Whether all addresses have the same underlying public key"}}},"AccountConvertResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/convert","required":["ss58Prefix","network","address","accountId","scheme","publicKey"],"properties":{"accountId":{"type":"string","description":"The original AccountId (hex)"},"address":{"type":"string","description":"The SS58-encoded address"},"network":{"type":"string","description":"Network name corresponding to the SS58 prefix"},"publicKey":{"type":"boolean","description":"Whether the input was treated as a public key"},"scheme":{"type":"string","description":"The cryptographic scheme used"},"ss58Prefix":{"type":"integer","format":"int32","description":"SS58 prefix used for encoding","minimum":0}}},"AccountValidateResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/validate","required":["isValid"],"properties":{"accountId":{"type":["string","null"],"description":"The account ID in hex format (null if invalid)"},"isValid":{"type":"boolean","description":"Whether the address is valid"},"network":{"type":["string","null"],"description":"The network name for the prefix (null if invalid/unknown)"},"ss58Prefix":{"type":["string","null"],"description":"The SS58 prefix (null if invalid)"}}},"AddressDetails":{"type":"object","description":"Details about a single address","required":["ss58Format"],"properties":{"network":{"type":["string","null"],"description":"The network name for the prefix (null if invalid/unknown)"},"publicKey":{"type":["string","null"],"description":"The public key in hex format (null if invalid)"},"ss58Format":{"type":"string","description":"The original SS58 format address"},"ss58Prefix":{"type":["integer","null"],"format":"int32","description":"The SS58 prefix (null if invalid)","minimum":0}}},"AssetApprovalResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/asset-approvals","required":["at"],"properties":{"ahTimestamp":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"The approved amount (null if approval doesn\'t exist)"},"at":{"$ref":"#/components/schemas/BlockInfo"},"deposit":{"type":["string","null"],"description":"The deposit associated with the approval (null if approval doesn\'t exist)"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"AssetBalance":{"type":"object","description":"Asset balance information","required":["assetId","balance","isFrozen","isSufficient"],"properties":{"assetId":{"type":"string","description":"Asset ID as string (matches Sidecar format)"},"balance":{"type":"string","description":"Balance as string (u128 serialized as decimal string)"},"isFrozen":{"type":"boolean"},"isSufficient":{"type":"boolean"}}},"AssetBalancesResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/asset-balances","required":["at","assets"],"properties":{"ahTimestamp":{"type":["string","null"]},"assets":{"type":"array","items":{"$ref":"#/components/schemas/AssetBalance"}},"at":{"$ref":"#/components/schemas/BlockInfo"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"BalanceInfoResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/balance-info","required":["at","nonce","tokenSymbol","free","reserved","miscFrozen","feeFrozen","frozen","transferable","locks"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"feeFrozen":{"type":"string","description":"The amount that free may not drop below when withdrawing specifically for\\ntransaction fee payment (legacy field, may be string message for newer runtimes)"},"free":{"type":"string","description":"Free balance (not equivalent to spendable balance)"},"frozen":{"type":"string","description":"Frozen balance (newer runtimes, may be string message for older runtimes)"},"locks":{"type":"array","items":{"$ref":"#/components/schemas/BalanceLock"},"description":"Array of balance locks"},"miscFrozen":{"type":"string","description":"The amount that free may not drop below when withdrawing for anything except\\ntransaction fee payment (legacy field, may be string message for newer runtimes)"},"nonce":{"type":"string","description":"Account nonce"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]},"reserved":{"type":"string","description":"Reserved balance"},"tokenSymbol":{"type":"string","description":"Token symbol"},"transferable":{"type":"string","description":"Calculated transferable balance using: free - max(maybeED, frozen - reserved)"}}},"BalanceLock":{"type":"object","description":"Balance lock information","required":["id","amount","reasons"],"properties":{"amount":{"type":"string","description":"Amount locked"},"id":{"type":"string","description":"Lock identifier"},"reasons":{"type":"string","description":"Lock reasons (Fee = 0, Misc = 1, All = 2)"}}},"BlockInfo":{"type":"object","description":"Block information","required":["hash","height"],"properties":{"hash":{"type":"string"},"height":{"type":"string"}}},"CapabilitiesResponse":{"type":"object","required":["chain","pallets"],"properties":{"chain":{"type":"string"},"pallets":{"type":"array","items":{"type":"string"}}}},"ClaimedReward":{"type":"object","description":"Claimed reward status for a specific era","required":["era","status"],"properties":{"era":{"type":"string","description":"Era index"},"status":{"type":"string","description":"Claim status (\\"claimed\\" or \\"unclaimed\\")"}}},"EraPayouts":{"oneOf":[{"$ref":"#/components/schemas/EraPayoutsData","description":"Successful payout data for an era"},{"type":"object","description":"Error message when payouts cannot be calculated","required":["message"],"properties":{"message":{"type":"string"}}}],"description":"Payouts for a single era - can be either actual payouts or an error message"},"EraPayoutsData":{"type":"object","description":"Actual payout data for an era","required":["era","totalEraRewardPoints","totalEraPayout","payouts"],"properties":{"era":{"type":"string","description":"Era index"},"payouts":{"type":"array","items":{"$ref":"#/components/schemas/ValidatorPayout"},"description":"Individual payouts for validators nominated"},"totalEraPayout":{"type":"string","description":"Total payout for the era"},"totalEraRewardPoints":{"type":"string","description":"Total reward points for the era"}}},"FeeEstimateResponse":{"type":"object","required":["weight","class","partialFee"],"properties":{"class":{"type":"string"},"partialFee":{"type":"string"},"weight":{"$ref":"#/components/schemas/Weight"}}},"HealthResponse":{"type":"object","required":["status"],"properties":{"connected_chains":{"type":["integer","null"],"minimum":0},"status":{"type":"string"},"uptime":{"type":["integer","null"],"format":"int64","minimum":0}}},"MethodInfo":{"type":"object","description":"Method information (pallet and method name).","required":["pallet","method"],"properties":{"method":{"type":"string","description":"Method name in lowerCamelCase","example":"transferAllowDeath"},"pallet":{"type":"string","description":"Pallet name in lowerCamelCase","example":"balances"}}},"NodeVersionResponse":{"type":"object","required":["clientVersion","clientImplName","chain"],"properties":{"chain":{"type":"string"},"clientImplName":{"type":"string"},"clientVersion":{"type":"string"}}},"NominationsInfo":{"type":"object","description":"Nominations information for a nominator","required":["targets","submittedIn","suppressed"],"properties":{"submittedIn":{"type":"string","description":"Era in which nomination was submitted"},"suppressed":{"type":"boolean","description":"Whether nominations are suppressed"},"targets":{"type":"array","items":{"type":"string"},"description":"List of validator addresses being nominated"}}},"ParseError":{"type":"object","description":"Error response for transaction parsing failures.","required":["code","error","transaction","cause","stack"],"properties":{"cause":{"type":"string","description":"Cause of the error"},"code":{"type":"integer","format":"int32","description":"HTTP status code","example":400,"minimum":0},"error":{"type":"string","description":"Error message","example":"Failed to parse transaction."},"stack":{"type":"string","description":"Stack trace"},"transaction":{"type":"string","description":"The transaction that failed to parse"}}},"ParseRequest":{"type":"object","description":"Request body for transaction parsing.","properties":{"tx":{"type":["string","null"],"description":"Hex-encoded extrinsic with optional 0x prefix.","example":"0x4902840004316d995f..."}}},"ParseResponse":{"type":"object","description":"Response for successful transaction parsing.","required":["isSigned","method","args","era","hash"],"properties":{"args":{"type":"object","description":"Decoded call arguments"},"era":{"type":"object","description":"Era/mortality information"},"hash":{"type":"string","description":"Blake2-256 hash of the extrinsic","example":"0x1234567890abcdef..."},"isSigned":{"type":"boolean","description":"Whether the extrinsic is signed","example":true},"method":{"$ref":"#/components/schemas/MethodInfo","description":"Pallet and method information"},"nonce":{"type":["string","null"],"description":"Account nonce (only present for signed extrinsics)","example":"42"},"signature":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/SignatureInfo","description":"Signature information (only present for signed extrinsics)"}]},"tip":{"type":["string","null"],"description":"Tip amount (only present for signed extrinsics)","example":"0"}}},"PoolAssetApprovalResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/pool-asset-approvals","required":["at"],"properties":{"ahTimestamp":{"type":["string","null"]},"amount":{"type":["string","null"],"description":"The approved amount (null if approval doesn\'t exist)"},"at":{"$ref":"#/components/schemas/BlockInfo"},"deposit":{"type":["string","null"],"description":"The deposit associated with the approval (null if approval doesn\'t exist)"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"PoolAssetBalance":{"type":"object","description":"Pool asset balance information","required":["assetId","balance","isFrozen","isSufficient"],"properties":{"assetId":{"type":"string","description":"Asset ID as string (matches Sidecar format)"},"balance":{"type":"string","description":"Balance as string (u128 serialized as decimal string)"},"isFrozen":{"type":"boolean"},"isSufficient":{"type":"boolean"}}},"PoolAssetBalancesResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/pool-asset-balances","required":["at","poolAssets"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"poolAssets":{"type":"array","items":{"$ref":"#/components/schemas/PoolAssetBalance"}},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"ProxyDefinition":{"type":"object","description":"A proxy definition containing the delegate, proxy type, and delay","required":["delegate","proxyType","delay"],"properties":{"delay":{"type":"string","description":"The announcement delay in blocks"},"delegate":{"type":"string","description":"The delegate address that can act on behalf of the account"},"proxyType":{"type":"string","description":"The type of proxy (e.g., \\"Any\\", \\"Staking\\", \\"Governance\\", etc.)"}}},"ProxyInfoResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/proxy-info","required":["at","delegatedAccounts","depositHeld"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"delegatedAccounts":{"type":"array","items":{"$ref":"#/components/schemas/ProxyDefinition"},"description":"Array of delegated accounts with their proxy definitions"},"depositHeld":{"type":"string","description":"The deposit held for the proxies"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"RcBalanceInfoResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/balance-info","required":["at","nonce","tokenSymbol","free","reserved","miscFrozen","feeFrozen","frozen","transferable","locks"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"feeFrozen":{"type":"string","description":"The amount that free may not drop below when withdrawing specifically for\\ntransaction fee payment (legacy field, may be string message for newer runtimes)"},"free":{"type":"string","description":"Free balance (not equivalent to spendable balance)"},"frozen":{"type":"string","description":"Frozen balance (newer runtimes, may be string message for older runtimes)"},"locks":{"type":"array","items":{"$ref":"#/components/schemas/BalanceLock"},"description":"Array of balance locks"},"miscFrozen":{"type":"string","description":"The amount that free may not drop below when withdrawing for anything except\\ntransaction fee payment (legacy field, may be string message for newer runtimes)"},"nonce":{"type":"string","description":"Account nonce"},"reserved":{"type":"string","description":"Reserved balance"},"tokenSymbol":{"type":"string","description":"Token symbol"},"transferable":{"type":"string","description":"Calculated transferable balance using: free - max(maybeED, frozen - reserved)"}}},"RcProxyInfoResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/proxy-info","required":["at","delegatedAccounts","depositHeld"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"delegatedAccounts":{"type":"array","items":{"$ref":"#/components/schemas/ProxyDefinition"},"description":"Array of delegated accounts with their proxy definitions"},"depositHeld":{"type":"string","description":"The deposit held for the proxies"}}},"RcStakingInfoResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/staking-info","required":["at","controller","rewardDestination","numSlashingSpans","staking"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"controller":{"type":"string","description":"Controller account address"},"nominations":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NominationsInfo","description":"Nominations info (null if not a nominator)"}]},"numSlashingSpans":{"type":"string","description":"Number of slashing spans"},"rewardDestination":{"$ref":"#/components/schemas/RewardDestination","description":"Where rewards are paid to"},"staking":{"$ref":"#/components/schemas/StakingLedger","description":"Staking ledger"}}},"RcStakingPayoutsResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/staking-payouts","required":["at","erasPayouts"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"erasPayouts":{"type":"array","items":{"$ref":"#/components/schemas/EraPayouts"},"description":"Array of era payouts"}}},"RcVestingInfoResponse":{"type":"object","description":"Response for GET /rc/accounts/{accountId}/vesting-info","required":["at","vesting"],"properties":{"at":{"$ref":"#/components/schemas/BlockInfo"},"vesting":{"type":"array","items":{"$ref":"#/components/schemas/VestingSchedule"},"description":"Array of vesting schedules (empty array if no vesting)"}}},"RewardDestination":{"oneOf":[{"type":"object","description":"Rewards are automatically re-staked","required":["staked"],"properties":{"staked":{"default":null}}},{"type":"object","description":"Rewards are sent to the stash account","required":["stash"],"properties":{"stash":{"default":null}}},{"type":"object","description":"Rewards are sent to the controller account","required":["controller"],"properties":{"controller":{"default":null}}},{"type":"object","description":"No reward destination","required":["none"],"properties":{"none":{"default":null}}},{"type":"object","description":"Rewards are sent to a specific account","required":["account"],"properties":{"account":{"type":"string","description":"Rewards are sent to a specific account"}}}],"description":"Reward destination - e.g. { \\"staked\\": null }, { \\"stash\\": null }, { \\"account\\": \\"...\\" }"},"SignatureInfo":{"type":"object","description":"Signature information for signed extrinsics.","required":["signer","signature"],"properties":{"signature":{"type":"string","description":"Hex-encoded signature","example":"0xa24152685f52e4726466e80247d965bb3d349637fc8a1ea6f7cc1451ddec98b5..."},"signer":{"$ref":"#/components/schemas/SignerId","description":"Signer account"}}},"SignerId":{"type":"object","description":"Signer identifier.","required":["id"],"properties":{"id":{"type":"string","description":"SS58-encoded account address","example":"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"}}},"StakingInfoResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/staking-info","required":["at","controller","rewardDestination","numSlashingSpans","staking"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"controller":{"type":"string","description":"Controller address"},"nominations":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NominationsInfo","description":"Nomination info (null if not a nominator)"}]},"numSlashingSpans":{"type":"string","description":"Number of slashing spans"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]},"rewardDestination":{"$ref":"#/components/schemas/RewardDestination","description":"Reward destination configuration"},"staking":{"$ref":"#/components/schemas/StakingLedger","description":"Staking ledger information"}}},"StakingLedger":{"type":"object","description":"Staking ledger information","required":["stash","total","active","unlocking"],"properties":{"active":{"type":"string","description":"Active staked balance"},"claimedRewards":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ClaimedReward"},"description":"Claimed rewards per era (only when includeClaimedRewards=true)"},"stash":{"type":"string","description":"Stash account address"},"total":{"type":"string","description":"Total locked balance (active + unlocking)"},"unlocking":{"type":"array","items":{"$ref":"#/components/schemas/UnlockingChunk"},"description":"Unlocking chunks with value and era"}}},"StakingPayoutsResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/staking-payouts","required":["at","erasPayouts"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"erasPayouts":{"type":"array","items":{"$ref":"#/components/schemas/EraPayouts"},"description":"Array of era payouts"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]}}},"TransactionPoolEntry":{"type":"object","required":["hash","encodedExtrinsic"],"properties":{"encodedExtrinsic":{"type":"string"},"hash":{"type":"string"},"partialFee":{"type":["string","null"]},"priority":{"type":["string","null"]},"tip":{"type":["string","null"]}}},"TransactionPoolResponse":{"type":"object","required":["pool"],"properties":{"pool":{"type":"array","items":{"$ref":"#/components/schemas/TransactionPoolEntry"}}}},"UnlockingChunk":{"type":"object","description":"Unlocking chunk with value and era when funds become available","required":["value","era"],"properties":{"era":{"type":"string","description":"Era when funds become available"},"value":{"type":"string","description":"Amount being unlocked"}}},"ValidatorPayout":{"type":"object","description":"Payout information for a single validator","required":["validatorId","nominatorStakingPayout","claimed","totalValidatorRewardPoints","validatorCommission","totalValidatorExposure","nominatorExposure"],"properties":{"claimed":{"type":"boolean","description":"Whether the reward has been claimed"},"nominatorExposure":{"type":"string","description":"Nominator\'s stake behind this validator"},"nominatorStakingPayout":{"type":"string","description":"Calculated payout amount for the nominator"},"totalValidatorExposure":{"type":"string","description":"Total stake behind this validator"},"totalValidatorRewardPoints":{"type":"string","description":"Validator\'s reward points for this era"},"validatorCommission":{"type":"string","description":"Validator\'s commission (as parts per billion, 0-1000000000)"},"validatorId":{"type":"string","description":"Validator stash account ID"}}},"VersionResponse":{"type":"object","required":["version"],"properties":{"version":{"type":"string"}}},"VestingInfoResponse":{"type":"object","description":"Response for GET /accounts/{accountId}/vesting-info","required":["at","vesting"],"properties":{"ahTimestamp":{"type":["string","null"]},"at":{"$ref":"#/components/schemas/BlockInfo"},"rcBlockHash":{"type":["string","null"]},"rcBlockNumber":{"type":["string","null"]},"vesting":{"type":"array","items":{"$ref":"#/components/schemas/VestingSchedule"},"description":"Array of vesting schedules (empty array if no vesting)"}}},"VestingSchedule":{"type":"object","description":"A vesting schedule","required":["locked","perBlock","startingBlock"],"properties":{"locked":{"type":"string","description":"Total tokens locked at start of vesting"},"perBlock":{"type":"string","description":"Tokens unlocked per block"},"startingBlock":{"type":"string","description":"Block when vesting begins"}}},"Weight":{"type":"object","required":["refTime","proofSize"],"properties":{"proofSize":{"type":"string"},"refTime":{"type":"string"}}}}},"tags":[{"name":"health","description":"Health check"},{"name":"node","description":"Connected node information"},{"name":"version","description":"API version"},{"name":"blocks","description":"Block queries and extrinsic data"},{"name":"accounts","description":"Account balance, staking, and proxy information"},{"name":"pallets","description":"Runtime pallet metadata, storage, constants, events, errors"},{"name":"runtime","description":"Runtime specification, metadata, and code"},{"name":"transaction","description":"Transaction submission, fee estimation, and construction material"},{"name":"coretime","description":"Coretime system information"},{"name":"paras","description":"Parachain inclusion data"},{"name":"ahm","description":"Asset Hub Migration information"},{"name":"capabilities","description":"API capabilities and chain pallets"},{"name":"rc","description":"Relay chain endpoints (available on parachains only)"}]}');function S(e){return S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},S(e)}function I(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,r)}return t}function w(e,n,t){return(n=P(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function R(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,o,i,s=[],c=!0,l=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;c=!1}else for(;!(c=(r=o.call(t)).done)&&(s.push(r.value),s.length!==n);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(l)throw a}}return s}}(e,n)||E(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function E(e,n){if(e){if("string"==typeof e)return _(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_(e,n):void 0}}function _(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t3?(a=h===r)&&(c=o[(s=o[4])?5:(s=3,3)],o[4]=o[5]=e):o[0]<=m&&((a=t<2&&mr||r>h)&&(o[4]=t,o[5]=r,u.n=h,s=0))}if(a||t>1)return i;throw p=!0,r}return function(a,d,h){if(l>1)throw TypeError("Generator is already running");for(p&&1===d&&m(d,h),s=d,c=h;(n=s<2?e:c)||!p;){o||(s?s<3?(s>1&&(u.n=-1),m(s,c)):u.n=c:u.v=c);try{if(l=2,o){if(s||(a="next"),n=o[a]){if(!(n=n.call(o,c)))throw TypeError("iterator result is not an object");if(!n.done)return n;c=n.value,s<2&&(s=0)}else 1===s&&(n=o.return)&&n.call(o),s<2&&(c=TypeError("The iterator does not provide a '"+a+"' method"),s=1);o=e}else if((n=(p=u.n<0)?c:t.call(r,u))!==i)break}catch(n){o=e,s=1,c=n}finally{l=1}}return{value:n,done:p}}}(t,a,o),!0),l}var i={};function s(){}function c(){}function l(){}n=Object.getPrototypeOf;var d=[][r]?n(n([][r]())):(T(n={},r,function(){return this}),n),p=l.prototype=s.prototype=Object.create(d);function u(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,T(e,a,"GeneratorFunction")),e.prototype=Object.create(p),e}return c.prototype=l,T(p,"constructor",l),T(l,"constructor",c),c.displayName="GeneratorFunction",T(l,a,"GeneratorFunction"),T(p),T(p,a,"Generator"),T(p,r,function(){return this}),T(p,"toString",function(){return"[object Generator]"}),(q=function(){return{w:o,m:u}})()}function T(e,n,t,r){var a=Object.defineProperty;try{a({},"",{})}catch(e){a=0}T=function(e,n,t,r){function o(n,t){T(e,n,function(e){return this._invoke(n,t,e)})}n?a?a(e,n,{value:t,enumerable:!r,configurable:!r,writable:!r}):e[n]=t:(o("next",0),o("throw",1),o("return",2))},T(e,n,t,r)}function A(e,n,t,r,a,o,i){try{var s=e[o](i),c=s.value}catch(e){return void t(e)}s.done?n(c):Promise.resolve(c).then(r,a)}function C(e,n){for(var t=0;t0}).sort(function(e,n){return e.name.localeCompare(n.name)})}},{key:"getAllSchemas",value:function(){return Array.from(this.schemas.values()).sort(function(e,n){return e.name.localeCompare(n.name)})}},{key:"search",value:function(e){if(!e||e.length<2)return{endpoints:[],schemas:[]};var n=e.toLowerCase(),t={endpoints:[],schemas:[]};return this.endpoints.forEach(function(e){"".concat(e.path," ").concat(e.summary," ").concat(e.description," ").concat(e.tags.join(" ")).toLowerCase().includes(n)&&t.endpoints.push(e)}),this.schemas.forEach(function(e){"".concat(e.name," ").concat(e.description||"").toLowerCase().includes(n)&&t.schemas.push(e)}),t.endpoints.sort(function(e,t){return(e.path.toLowerCase().includes(n)?0:1)-(t.path.toLowerCase().includes(n)?0:1)}),t.schemas.sort(function(e,t){return(e.name.toLowerCase().includes(n)?0:1)-(t.name.toLowerCase().includes(n)?0:1)}),t}},{key:"getApiInfo",value:function(){var e,n,t,r,a;return this.spec?{title:(null===(e=this.spec.info)||void 0===e?void 0:e.title)||"API Documentation",description:(null===(n=this.spec.info)||void 0===n?void 0:n.description)||"",version:(null===(t=this.spec.info)||void 0===t?void 0:t.version)||"1.0.0",contact:(null===(r=this.spec.info)||void 0===r?void 0:r.contact)||{},license:(null===(a=this.spec.info)||void 0===a?void 0:a.license)||{},servers:this.spec.servers||[]}:null}},{key:"getServers",value:function(){var e;return(null===(e=this.spec)||void 0===e?void 0:e.servers)||[]}},{key:"formatEndpointPath",value:function(e){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"")+e.path}},{key:"generateExampleRequest",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",t=this.formatEndpointPath(e,n),r=e.method,a="curl -X ".concat(r,' "').concat(t,'"');if("GET"!==r&&(a+=' \\\n -H "Content-Type: application/json"'),e.requestBody){var o,i=null===(o=e.requestBody.content)||void 0===o?void 0:o["application/json"];null!=i&&i.example&&(a+=" \\\n -d '".concat(JSON.stringify(i.example,null,2),"'"))}return a}},{key:"getMethodColorClass",value:function(e){return{GET:"method-get",POST:"method-post",PUT:"method-put",DELETE:"method-delete",PATCH:"method-patch",HEAD:"method-head",OPTIONS:"method-options"}[e]||"method-default"}},{key:"generateExampleFromSchema",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Set;if(n>10)return"...";if(!e)return null;if(0===n){var r=JSON.stringify(e);if(this.exampleCache.has(r))return this.exampleCache.get(r);var a=this._generateExampleFromSchemaInternal(e,n,t);return this.exampleCache.set(r,a),a}return this._generateExampleFromSchemaInternal(e,n,t)}},{key:"_generateExampleFromSchemaInternal",value:function(e){var n=this,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Set;if(t>10)return"...";if(!e)return null;if(e.$ref){var a=this.resolveRef(e.$ref);if(!a||r.has(a))return"[Reference to ".concat(a,"]");r.add(a);var o=this.schemas.get(a);if(o){var i=this._generateExampleFromSchemaInternal(o,t+1,r);return r.delete(a),i}return"[".concat(a," schema not found]")}if(e.oneOf&&e.oneOf.length>0)return this._generateExampleFromSchemaInternal(e.oneOf[0],t+1,r);if(e.anyOf&&e.anyOf.length>0)return this._generateExampleFromSchemaInternal(e.anyOf[0],t+1,r);if(e.allOf&&e.allOf.length>0){var s,c={},l=function(e){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=E(e))){n&&(e=n);var t=0,r=function(){};return{s:r,n:function(){return t>=e.length?{done:!0}:{done:!1,value:e[t++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){i=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(i)throw a}}}}(e.allOf);try{for(l.s();!(s=l.n()).done;){var d=s.value,p=this._generateExampleFromSchemaInternal(d,t+1,r);p&&"object"===S(p)&&Object.assign(c,p)}}catch(e){l.e(e)}finally{l.f()}return Object.keys(c).length>0?c:null}if("array"===e.type&&e.items)return[this._generateExampleFromSchemaInternal(e.items,t+1,r)];if("object"===e.type){var u={};return e.properties&&Object.entries(e.properties).forEach(function(e){var a=R(e,2),o=a[0],i=a[1];u[o]=n._generateExampleFromSchemaInternal(i,t+1,r)}),u}return this.generateExampleForPrimitive(e)}},{key:"generateExampleForPrimitive",value:function(e){var n=e.type,t=e.format;if(void 0!==e.example)return e.example;if(e.enum&&e.enum.length>0)return e.enum[0];if(t)switch(t){case"SS58":return"15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5";case"unsignedInteger":return"1000000000000";case"$hex":return"0x1234567890abcdef";case"date-time":return"2023-01-01T12:00:00.000Z";case"uuid":return"123e4567-e89b-12d3-a456-426614174000";case"email":return"example@email.com";case"uri":return"https://example.com";case"binary":return"base64EncodedData"}switch(n){case"string":return e.description&&e.description.toLowerCase().includes("hash")?"0x1234567890abcdef1234567890abcdef12345678":e.description&&e.description.toLowerCase().includes("address")?"15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5":"example_string";case"number":case"integer":return 123;case"boolean":return!0;default:return null}}},{key:"generateExampleResponse",value:function(e){var n,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"200";if(!e.responses||!e.responses[t])return null;var r=null===(n=e.responses[t].content)||void 0===n?void 0:n["application/json"];return r&&r.schema?this.generateExampleFromSchema(r.schema):null}},{key:"getAllExampleResponses",value:function(e){var n=this;if(!e.responses)return{};var t={};return Object.entries(e.responses).forEach(function(r){var a=R(r,2),o=a[0],i=a[1],s=n.generateExampleResponse(e,o);null!==s&&(t[o]={description:i.description,example:s})}),t}}],n&&C(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t,r}();function j(e){return j="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},j(e)}function z(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,o,i,s=[],c=!0,l=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;c=!1}else for(;!(c=(r=o.call(t)).done)&&(s.push(r.value),s.length!==n);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(l)throw a}}return s}}(e,n)||function(e,n){if(e){if("string"==typeof e)return O(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?O(e,n):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function O(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t\n ').concat(e.capitalizeFirst(t.name),'\n ').concat(t.endpoints.length,'\n \n \n \n \n \n "),n.appendChild(r)}),this.parser.getAllSchemas().slice(0,20).forEach(function(e){var n=document.createElement("li");n.className="nav-item",n.innerHTML='\n \n 📋\n ').concat(e.name,"\n \n "),t.appendChild(n)}))}},{key:"renderEndpoint",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(!e)return"";var t=this.parser.generateExampleRequest(e,n);return'\n
    \n
    \n
    \n ').concat(e.method,'\n

    ').concat(e.path,'

    \n
    \n
    \n ').concat(e.tags.map(function(e){return''.concat(e,"")}).join(""),'\n
    \n
    \n\n
    \n ').concat(e.summary?'

    '.concat(e.summary,"

    "):"","\n ").concat(e.description?'
    '.concat(this.formatDescription(e.description),"
    "):"","\n\n ").concat(this.renderParameters(e.parameters),"\n ").concat(this.renderRequestBody(e.requestBody),"\n ").concat(this.renderResponses(e.responses),"\n ").concat(this.renderExampleRequest(t,e),"\n
    \n
    \n ")}},{key:"renderParameters",value:function(e){var n=this;if(!e||0===e.length)return"";var t=this.groupParametersByLocation(e);return'\n
    \n

    Parameters

    \n '.concat(Object.entries(t).map(function(e){var t=z(e,2),r=t[0],a=t[1];return'\n
    \n

    '.concat(n.capitalizeFirst(r),' Parameters

    \n
    \n ').concat(a.map(function(e){return n.renderParameter(e)}).join(""),"\n
    \n
    \n ")}).join(""),"\n
    \n ")}},{key:"groupParametersByLocation",value:function(e){return e.reduce(function(e,n){var t=n.in||"query";return e[t]||(e[t]=[]),e[t].push(n),e},{})}},{key:"renderParameter",value:function(e){var n=this.getTypeInfo(e.schema);return'\n
    \n
    \n
    \n '.concat(e.name,"\n ").concat(e.required?'required':'optional','\n
    \n
    ').concat(n,"
    \n ").concat(e.description?'
    '.concat(e.description,"
    "):"","\n
    \n
    \n ")}},{key:"renderRequestBody",value:function(e){return e?'\n
    \n

    Request Body

    \n '.concat(e.required?'required':"","\n ").concat(e.description?'

    '.concat(e.description,"

    "):"","\n ").concat(this.renderContent(e.content),"\n
    \n "):""}},{key:"renderResponses",value:function(e){var n=this;return e&&0!==Object.keys(e).length?'\n
    \n

    Responses

    \n
    \n '.concat(Object.entries(e).map(function(e){var t=z(e,2),r=t[0],a=t[1];return n.renderResponse(r,a)}).join(""),"\n
    \n
    \n "):""}},{key:"renderResponse",value:function(e,n){var t=this.getStatusClass(e);return'\n
    \n
    \n ').concat(e,'\n ').concat(n.description,"\n
    \n ").concat(n.content?this.renderContent(n.content):"","\n
    \n ")}},{key:"renderContent",value:function(e){var n=this;return e?'\n
    \n '.concat(Object.entries(e).map(function(e){var t=z(e,2),r=t[0],a=t[1];return'\n
    \n

    '.concat(r,"

    \n ").concat(a.schema?n.renderSchema(a.schema):"","\n ").concat(a.example?n.renderExample(a.example,r):"","\n ").concat(a.schema?n.renderSchemaExample(a.schema,r):"","\n
    \n ")}).join(""),"\n
    \n "):""}},{key:"renderSchema",value:function(e){var n=this,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!e)return"";if(t>3)return'
    Schema too deep...
    ';if(e.$ref){var r=e.resolvedRef;return'\n \n ")}return"object"===e.type&&e.properties?'\n
    \n
    object
    \n
    \n ').concat(Object.entries(e.properties).map(function(r){var a,o=z(r,2),i=o[0],s=o[1];return'\n
    \n
    \n '.concat(i,"\n ").concat(null!==(a=e.required)&&void 0!==a&&a.includes(i)?'required':"",'\n ').concat(n.getTypeInfo(s),"\n
    \n ").concat(s.description?'
    '.concat(s.description,"
    "):"","\n ").concat(n.renderSchema(s,t+1),"\n
    \n ")}).join(""),"\n
    \n
    \n "):"array"===e.type&&e.items?'\n
    \n
    array of:
    \n ').concat(this.renderSchema(e.items,t+1),"\n
    \n "):'\n
    \n ').concat(this.getTypeInfo(e),"\n ").concat(e.description?''.concat(e.description,""):"","\n
    \n ")}},{key:"renderExample",value:function(e,n){var t=this.formatExample(e,n),r=this.getLanguageFromMediaType(n);return'\n
    \n
    \n Example\n \n
    \n
    \n
    ').concat(this.escapeHtml(t),"
    \n
    \n
    \n ")}},{key:"renderSchemaExample",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"application/json";if(!e)return"";try{var t=this.parser.generateExampleFromSchema(e);if(!t)return'\n
    \n
    \n Generated Example Response\n
    \n
    Unable to generate example from this schema
    \n
    \n ';var r=this.formatExample(t,n);return'\n
    \n
    \n Generated Example Response\n \n
    \n
    \n
    ').concat(this.escapeHtml(r),'
    \n
    \n
    \n 💡 This example was automatically generated from the API schema\n
    \n ').concat(this.renderDataSchemaSection(e),"\n
    \n ")}catch(n){return console.error("Error generating example from schema:",n,e),'\n
    \n
    \n Generated Example Response\n
    \n
    \n ⚠️ Error generating example\n Schema processing failed: '.concat(n.message,"\n
    \n
    \n ")}}},{key:"renderDataSchemaSection",value:function(e){if(!e)return"";var n=this.extractSchemaReferences(e);return 0===n.length?"":'\n
    \n
    \n 📋 Data Schema\n
    \n \n \n
    \n ')}},{key:"extractSchemaReferences",value:function(e){var n=this,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Set,r=new Set;if(!e||"object"!==j(e))return Array.from(r);if(e.$ref){var a=this.parser.resolveRef(e.$ref);if(a&&!t.has(a)){r.add(a),t.add(a);var o=this.parser.getSchema(a);o&&this.extractSchemaReferences(o,t).forEach(function(e){return r.add(e)})}}return e.oneOf&&e.oneOf.forEach(function(e){n.extractSchemaReferences(e,t).forEach(function(e){return r.add(e)})}),e.anyOf&&e.anyOf.forEach(function(e){n.extractSchemaReferences(e,t).forEach(function(e){return r.add(e)})}),e.allOf&&e.allOf.forEach(function(e){n.extractSchemaReferences(e,t).forEach(function(e){return r.add(e)})}),e.items&&this.extractSchemaReferences(e.items,t).forEach(function(e){return r.add(e)}),e.properties&&Object.values(e.properties).forEach(function(e){n.extractSchemaReferences(e,t).forEach(function(e){return r.add(e)})}),Array.from(r)}},{key:"renderExampleRequest",value:function(e,n){return'\n
    \n

    Try this endpoint

    \n '.concat(this.renderParameterInputs(n),"\n ").concat(this.renderGeneratedCurl(n),"\n
    \n ")}},{key:"renderParameterInputs",value:function(e){var n=this;if(!e.parameters||0===e.parameters.length)return this.renderSimpleEndpoint(e);var t=e.parameters.filter(function(e){return"path"===e.in}),r=e.parameters.filter(function(e){return"query"===e.in});return'\n
    \n ').concat(t.length>0?'\n
    \n

    Required Parameters

    \n '.concat(t.map(function(t){return n.renderParameterInput(t,e.id,!0)}).join(""),"\n
    \n "):"","\n \n ").concat(r.length>0?'\n
    \n

    Optional Parameters

    \n '.concat(r.map(function(t){return n.renderParameterInput(t,e.id,!1)}).join(""),"\n
    \n "):"",'\n\n
    \n \n \n
    \n
    \n ')}},{key:"renderParameterInput",value:function(e,n,t){var r=this.getParameterPlaceholder(e),a=t?"required":"";return'\n
    \n \n \n
    \n ")}},{key:"renderSimpleEndpoint",value:function(e){return"curl -X ".concat(e.method.toUpperCase(),' "http://localhost:8080').concat(e.path,'"'),'\n
    \n

    This endpoint requires no parameters.

    \n
    \n \n \n
    \n \n \n
    \n ')}},{key:"renderGeneratedCurl",value:function(e){return'\n \n \n ')}},{key:"getParameterPlaceholder",value:function(e){var n,t=e.name.toLowerCase();if("usercblock"===t)return"true";if(t.includes("address")||t.includes("account"))return"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";if(t.includes("hash")||t.includes("blockhash"))return"0x1234...abcdef";if(t.includes("block")||t.includes("number")||t.includes("height"))return"1000000";if(t.includes("limit"))return"10";if(t.includes("page"))return"1";switch((null===(n=e.schema)||void 0===n?void 0:n.type)||e.type||"string"){case"integer":case"number":return"123";case"boolean":return"true";default:return"Enter ".concat(e.name)}}},{key:"generateEnhancedCurl",value:function(e,n){var t=this;if(!e)return"";var r=n+e.path,a=e.method.toUpperCase();if(e.parameters&&e.parameters.filter(function(e){return"path"===e.in}).forEach(function(e){var n=t.getParameterExample(e);r=r.replace("{".concat(e.name,"}"),n)}),e.parameters){var o=e.parameters.filter(function(e){return"query"===e.in});if(o.length>0){var i=o.map(function(e){var n=t.getParameterExample(e);return"".concat(e.name,"=").concat(n)}).join("&");r+="?".concat(i)}}var s="curl -X ".concat(a);if("GET"!==a&&(s+=' -H "Content-Type: application/json"'),e.requestBody&&("POST"===a||"PUT"===a||"PATCH"===a)){var c=this.generateExampleRequestBody(e.requestBody);c&&(s+=" \\\\\n -d '".concat(c,"'"))}return s+' \\\\\n "'.concat(r,'"')}},{key:"getParameterExample",value:function(e){var n,t;if(void 0!==e.example)return e.example;if(void 0!==(null===(n=e.schema)||void 0===n?void 0:n.example))return e.schema.example;var r=(null===(t=e.schema)||void 0===t?void 0:t.type)||e.type||"string",a=e.name.toLowerCase();if(a.includes("id"))return"12345";if(a.includes("hash")||a.includes("blockhash"))return"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";if(a.includes("address")||a.includes("account"))return"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";if(a.includes("block"))return"1000000";if(a.includes("number")||a.includes("height"))return"1000";if(a.includes("limit"))return"10";if(a.includes("page"))return"1";if(a.includes("at"))return"1000000";if(a.includes("from"))return"0";if(a.includes("to"))return"100";switch(r){case"integer":case"number":return"123";case"boolean":return"true";default:return"example"}}},{key:"generateExampleRequestBody",value:function(e){if(!e||!e.content)return null;var n=e.content["application/json"];return n&&n.schema?JSON.stringify({example:"request body - replace with actual data"}):null}},{key:"renderSchemaPage",value:function(e){return e?'\n
    \n
    \n

    ').concat(e.name,'

    \n
    \n ').concat(e.type||"object",'\n
    \n
    \n\n
    \n ').concat(e.description?'

    '.concat(e.description,"

    "):"",'\n \n
    \n

    Schema Definition

    \n ').concat(this.renderSchema(e),"\n
    \n
    \n
    \n "):""}},{key:"capitalizeFirst",value:function(e){return e.charAt(0).toUpperCase()+e.slice(1)}},{key:"truncatePath",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:30;return e.length>n?e.substring(0,n)+"...":e}},{key:"getTypeInfo",value:function(e){if(!e)return"unknown";var n=e.type||"object";return e.format&&(n+=" (".concat(e.format,")")),e.$ref&&(n=e.resolvedRef||"reference"),n}},{key:"getStatusClass",value:function(e){var n=parseInt(e);return n>=200&&n<300?"status-success":n>=300&&n<400?"status-redirect":n>=400&&n<500?"status-client-error":n>=500?"status-server-error":"status-default"}},{key:"formatDescription",value:function(e){return e.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/`(.*?)`/g,"$1").replace(/\n/g,"
    ")}},{key:"formatExample",value:function(e,n){return"application/json"===n?"string"==typeof e?e:JSON.stringify(e,null,2):"string"==typeof e?e:JSON.stringify(e)}},{key:"getLanguageFromMediaType",value:function(e){return{"application/json":"json","application/xml":"xml","text/plain":"text","text/html":"html","application/x-www-form-urlencoded":"text"}[e]||"text"}},{key:"escapeHtml",value:function(e){var n=document.createElement("div");return n.textContent=e,n.innerHTML}}],n&&L(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n}();function H(e){return H="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(e)}function D(e,n){for(var t=0;t0||e.schemas.length>0){var n='\n
    \n '.concat(e.endpoints.length>0?this.renderEndpointResults(e.endpoints):"","\n ").concat(e.schemas.length>0?this.renderSchemaResults(e.schemas):"","\n
    \n ");this.searchResults.innerHTML=n,this.showResults()}else this.renderNoResults()}},{key:"renderEndpointResults",value:function(e){var n=this,t=e.slice(0,8);return'\n
    \n
    \n

    Endpoints

    \n '.concat(e.length,'\n
    \n
    \n ').concat(t.map(function(e){return n.renderEndpointResult(e)}).join(""),"\n ").concat(e.length>8?'\n
    \n +'.concat(e.length-8," more endpoints\n
    \n "):"","\n
    \n
    \n ")}},{key:"renderEndpointResult",value:function(e){return'\n
    \n
    \n ').concat(e.method,'\n ').concat(e.path,'\n
    \n
    \n ').concat(e.summary||e.description||"No description available","\n
    \n ").concat(e.tags.length>0?'\n
    \n '.concat(e.tags.map(function(e){return''.concat(e,"")}).join(""),"\n
    \n "):"","\n
    \n ")}},{key:"renderSchemaResults",value:function(e){var n=this,t=e.slice(0,6);return'\n
    \n
    \n

    Schemas

    \n '.concat(e.length,'\n
    \n
    \n ').concat(t.map(function(e){return n.renderSchemaResult(e)}).join(""),"\n ").concat(e.length>6?'\n
    \n +'.concat(e.length-6," more schemas\n
    \n "):"","\n
    \n
    \n ")}},{key:"renderSchemaResult",value:function(e){return'\n
    \n
    \n 📋\n ').concat(e.name,'\n ').concat(e.type||"object","\n
    \n ").concat(e.description?'\n
    \n '.concat(this.truncateText(e.description,100),"\n
    \n "):"","\n
    \n ")}},{key:"renderNoResults",value:function(){this.searchResults.innerHTML='\n
    \n
    🔍
    \n
    \n

    No results found

    \n Try different keywords or check your spelling\n
    \n
    \n ',this.showResults()}},{key:"showResults",value:function(){this.searchResults&&(this.searchResults.style.display="block")}},{key:"hideResults",value:function(){this.searchResults&&(this.searchResults.style.display="none")}},{key:"clear",value:function(){this.searchResults&&(this.searchResults.innerHTML="",this.hideResults())}},{key:"highlightText",value:function(e,n){if(!n||!e)return e;var t=new RegExp("(".concat(this.escapeRegExp(n),")"),"gi");return e.replace(t,"$1")}},{key:"escapeRegExp",value:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}},{key:"truncateText",value:function(e,n){return e.length<=n?e:e.substring(0,n).trim()+"..."}},{key:"filterByTag",value:function(e){var n=this.parser.tags.get(e);return n?n.endpoints:[]}},{key:"getSuggestions",value:function(e){if(!e||e.length<2)return[];var n=new Set,t=e.toLowerCase();return this.parser.endpoints.forEach(function(e){e.path.toLowerCase().includes(t)&&n.add(e.path)}),this.parser.schemas.forEach(function(e){e.name.toLowerCase().includes(t)&&n.add(e.name)}),this.parser.tags.forEach(function(e){e.name.toLowerCase().includes(t)&&n.add(e.name)}),Array.from(n).slice(0,5)}},{key:"advancedSearch",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.query,t=void 0===n?"":n,r=e.tags,a=void 0===r?[]:r,o=e.methods,i=void 0===o?[]:o,s=e.responseStatus,c=void 0===s?[]:s,l=e.hasParameters,d=void 0===l?null:l,p={endpoints:[],schemas:[]};return p=t?this.search(t):{endpoints:Array.from(this.parser.endpoints.values()),schemas:Array.from(this.parser.schemas.values())},a.length>0&&(p.endpoints=p.endpoints.filter(function(e){return e.tags.some(function(e){return a.includes(e)})})),i.length>0&&(p.endpoints=p.endpoints.filter(function(e){return i.includes(e.method)})),c.length>0&&(p.endpoints=p.endpoints.filter(function(e){return Object.keys(e.responses).some(function(e){return c.includes(e)})})),null!==d&&(p.endpoints=p.endpoints.filter(function(e){var n=e.parameters&&e.parameters.length>0;return d?n:!n})),p}},{key:"getSearchStats",value:function(){return{totalEndpoints:this.parser.endpoints.size,totalSchemas:this.parser.schemas.size,totalTags:this.parser.tags.size,endpointsByMethod:this.getEndpointsByMethod(),endpointsByTag:this.getEndpointsByTag()}}},{key:"getEndpointsByMethod",value:function(){var e={};return this.parser.endpoints.forEach(function(n){e[n.method]||(e[n.method]=0),e[n.method]++}),e}},{key:"getEndpointsByTag",value:function(){var e={};return this.parser.tags.forEach(function(n){e[n.name]=n.endpoints.length}),e}}],n&&D(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n}();function F(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t
    ').concat(V(a.trim()),"
    "),r++,o}),o=[],i=function(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return F(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?F(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){t&&(e=t);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,s=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return i=e.done,e},e:function(e){s=!0,o=e},f:function(){try{i||null==t.return||t.return()}finally{if(s)throw o}}}}((a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=function(e){return e.replace(/^(\|[^|\n]+(?:\|[^|\n]*)*\|)\s*\n(\|[\s\-:|]+\|)\s*\n((?:^\|[^|\n]+(?:\|[^|\n]*)*\|\s*$\n?)+)/gm,function(e,n,t,r){var a=n.split("|").map(function(e){return e.trim()}).filter(function(e){return e}).map(function(e){return e.replace(/`([^`]+)`/g,"$1")}).map(function(e){return"".concat(e,"")}).join(""),o=r.trim().split("\n").filter(function(e){return e.trim()&&e.includes("|")}).map(function(e){var n=e.split("|").map(function(e){return e.trim()}).filter(function(e){return e}).map(function(e){return e.replace(/`([^`]+)`/g,"$1")}).map(function(e){return"".concat(e,"")}).join("");return"".concat(n,"")}).join("\n");return'
    \n\n\n'.concat(a,"\n\n\n").concat(o,"\n\n
    \n
    ")})}(a=a.replace(/## ⚠️ Important: (.*$)/gm,'
    ⚠️ Important: $1
    '))).replace(/^> \*\*Note\*\*: (.*$)/gm,'
    Note: $1
    ')).replace(/^> \*\*Important\*\*: (.*$)/gm,'
    Important: $1
    ')).replace(/^> (.*$)/gm,"
    $1
    ")).replace(/^# (.*$)/gm,function(e,n){var t=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");return'

    ').concat(n,"

    ")})).replace(/^## (.*$)/gm,function(e,n){var t=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");return'

    ').concat(n,"

    ")})).replace(/^### (.*$)/gm,function(e,n){var t=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");return'

    ').concat(n,"

    ")})).replace(/^#### (.*$)/gm,function(e,n){var t=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");return'

    ').concat(n,"

    ")})).replace(/\*\*(.*?)\*\*/g,"$1")).replace(/\*(.*?)\*/g,"$1")).replace(/`([^`]+)`/g,"$1")).replace(/\[([^\]]+)\]\(([^)]+)\)/g,function(e,n,t){return t.startsWith("#")?'').concat(n,""):'').concat(n,"")})).replace(/^- (.*$)/gm,"
  • $1
  • ")).replace(/^\d+\. (.*$)/gm,"
  • $1
  • ")).split(/\n\s*\n/));try{for(i.s();!(n=i.n()).done;){var s=n.value;if(s=s.trim())if(s.startsWith("")){var c=/^\d+\./.test(s.split("\n")[0])?"ol":"ul";o.push("<".concat(c,">").concat(s,""))}else o.push("

    ".concat(s.replace(/\n/g," "),"

    "))}}catch(e){i.e(e)}finally{i.f()}a=(a=o.join("\n\n")).replace(/<\/(ul|ol)>\s*<\1>/g,"");for(var l=0;l":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,function(e){return n[e]})}var W={"asset-hub-migration":$('# Asset Hub Migration & Elastic Scaling Guide\n\nThis comprehensive guide explains how to configure Asset Hub migration in Substrate API Sidecar and understand the related elastic scaling changes that prepare the API for future multi-block scenarios.\n\n## ⚠️ Important: Niche Feature Notice\n\n**The `useRcBlock` parameter and elastic scaling functionality is a specialized feature designed for stakeholders who specifically need to track Asset Hub blocks using relay chain block references.** \n\n**If you are not planning to use the relay chain as a way to track Asset Hub state, you can safely ignore everything related to `useRcBlock` and elastic scaling in this guide.** Standard Asset Hub queries will continue to work exactly as before without any configuration changes.\n\n## Environment Variables\n\n### Required Configuration\n\nTo properly handle Asset Hub migration, you need to configure two environment variables:\n\n1. `SAS_SUBSTRATE_URL`: The primary WebSocket URL for your Asset Hub node\n2. `SAS_SUBSTRATE_MULTI_CHAIN_URL`: A JSON array containing additional chain configurations\n\n### Important Note on Node Requirements\n\nIf you need to use any of the endpoints that require multi-chain configuration (like `/pallets/staking/progress`), you will need to run two separate nodes:\n- One node for the Asset Hub chain\n- One node for the relay chain\n\nBoth nodes must be running and accessible for these endpoints to function properly.\n\n### Multi-Chain Configuration\n\nThe `SAS_SUBSTRATE_MULTI_CHAIN_URL` environment variable accepts a JSON array of chain configurations. Each configuration object should contain:\n\n- `url`: The WebSocket URL for the additional node\n- `type`: The type of chain (can be \'relay\', \'assethub\', \'parachain\', or undefined)\n\nCurrently, this configuration is primarily used for:\n- Querying staking information\n- Retrieving additional session/babe information from the relay chain\n\nIn future releases, this configuration will also be used to improve performance by allowing Sidecar to retrieve information from multiple nodes.\n\n## Example Configuration\n\nHere\'s an example configuration for Westend network:\n\n```bash\n# Primary Asset Hub node\nSAS_SUBSTRATE_URL=wss://westend-asset-hub-rpc.polkadot.io\n\n# Additional chain configuration (relay chain in this case)\nSAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"wss://westend-rpc.polkadot.io","type":"relay"}]\'\n```\n\n## Affected Endpoints\n\nCurrently, only the following endpoint requires the multi-chain configuration:\n- `/pallets/staking/progress`\n\nThe `/pallets/staking/progress` endpoint requires two chains because it needs to combine information from both chains:\n- The Asset Hub chain provides era information from the staking pallet\n- The relay chain provides additional storage information from the babe pallet\n\nThis dual-chain requirement is specific to this endpoint, as it needs to gather information from both sources to provide complete staking progress data.\n\n## Elastic Scaling & Response Structure Changes\n\n> **Note**: This section only applies if you are using the `useRcBlock` parameter. If you\'re not using relay chain block tracking, you can skip this entire section.\n\n**Important**: All endpoints that support the `useRcBlock` parameter return array responses instead of single enhanced objects (when used). This prepares the API for Polkadot/Kusama elastic scaling where multiple Asset Hub blocks could exist per relay chain block.\n\n### What Changed\n\n#### New Array Response Behavior\n\nWhen using `useRcBlock` parameter, endpoints now return an array of response objects:\n\n```json\n[\n {\n "at": {\n "hash": "0x...",\n "height": "1234567"\n },\n "data": "...",\n "rcBlockNumber": "5678901",\n "ahTimestamp": "1234567890"\n }\n]\n```\n\nIf no Asset Hub blocks are found for the specified relay chain block, an empty array is returned:\n\n```json\n[]\n```\n\n#### Affected Parameters\n\n- **`useRcBlock`**: When set to \'true\', uses the relay chain block specified in the \'at\' parameter to determine corresponding Asset Hub block(s)\n\n#### Response Format Summary\n\n- **With `useRcBlock=true`**: Returns `[{...result, rcBlockNumber, ahTimestamp}]` or `[]`\n- **Without `useRcBlock`**: Returns single response object (unchanged)\n\n### Affected Endpoints\n\n> **Note**: These endpoints only change behavior when using `useRcBlock=true`. Without this parameter, they work exactly as before.\n\nAll the following endpoints support the `useRcBlock` parameter and return array responses when it\'s used:\n\n#### Account Endpoints\n- `/accounts/{accountId}/asset-balances`\n- `/accounts/{accountId}/asset-approvals`\n- `/accounts/{accountId}/pool-asset-balances`\n- `/accounts/{accountId}/pool-asset-approvals`\n- `/accounts/{accountId}/balance-info`\n- `/accounts/{accountId}/staking-info`\n- `/accounts/{accountId}/staking-payouts`\n- `/accounts/{accountId}/vesting-info`\n- `/accounts/{accountId}/proxy-info`\n\n#### Block Endpoints (useRcBlock)\n- `/blocks/head`\n- `/blocks/{blockId}`\n- `/blocks/{blockId}/header`\n- `/blocks/head/header`\n- `/blocks/{blockId}/extrinsics/{extrinsicIndex}`\n- `/blocks/{blockId}/extrinsics-raw`\n- `/blocks`\n\n#### Pallets Endpoints\n- `/pallets/asset-conversion/next-available-id`\n- `/pallets/asset-conversion/liquidity-pools`\n- `/pallets/assets/{assetId}/asset-info`\n- `/pallets/{palletId}/consts`\n- `/pallets/{palletId}/consts/{constantItemId}`\n- `/pallets/{palletId}/dispatchables`\n- `/pallets/{palletId}/dispatchables/{dispatchableItemId}`\n- `/pallets/{palletId}/errors`\n- `/pallets/{palletId}/errors/{errorItemId}`\n- `/pallets/{palletId}/events`\n- `/pallets/{palletId}/events/{eventItemId}`\n- `/pallets/foreign-assets`\n- `/pallets/nomination-pools/info`\n- `/pallets/nomination-pools/{poolId}`\n- `/pallets/ongoing-referenda`\n- `/pallets/pool-assets/{assetId}/asset-info`\n- `/pallets/staking/progress`\n- `/pallets/staking/validators`\n- `/pallets/{palletId}/storage`\n- `/pallets/{palletId}/storage/{storageItemId}`\n\n## Migration Steps\n\n> **Important Reminder**: These migration steps are only necessary if you plan to use the `useRcBlock` parameter for relay chain block tracking. Standard Asset Hub functionality requires no migration.\n\n### 1. Complete Environment Setup\n\nEnsure your Substrate API Sidecar instance is configured with both Asset Hub and relay chain nodes:\n\n```bash\n# Asset Hub node (primary)\nSAS_SUBSTRATE_URL=wss://westend-asset-hub-rpc.polkadot.io\n\n# Relay chain node (secondary, required for useRcBlock functionality)\nSAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"wss://westend-rpc.polkadot.io","type":"relay"}]\'\n```\n\n### 2. Update Response Handling\n\nIf you\'re using `useRcBlock` parameter, update your code to handle array responses:\n\n```javascript\nconst response = await fetch(\'/accounts/123/balance-info?at=5000000&useRcBlock=true\');\nconst data = await response.json();\n\n// Handle array response\nif (data.length === 0) {\n console.log(\'No Asset Hub blocks found for this relay chain block\');\n} else {\n // Process each Asset Hub block (currently will be 0 or 1, but prepared for multiple)\n data.forEach(item => {\n console.log(item.free);\n console.log(item.rcBlockNumber);\n });\n}\n```\n\n### 3. Check for Empty Results\n\nThe new behavior returns empty arrays when no Asset Hub blocks are found:\n\n```javascript\nconst response = await fetch(\'/accounts/123/balance-info?at=5000000&useRcBlock=true\');\nconst data = await response.json();\n\nif (data.length === 0) {\n // No Asset Hub blocks found for this relay chain block\n console.log(\'No data available for this relay chain block\');\n return;\n}\n\n// Process results\nconst result = data[0]; // Get first (and currently only) result\n```\n\n### 4. Prepare for Future Elastic Scaling\n\nWhile current implementation returns 0 or 1 results, elastic scaling will enable multiple Asset Hub blocks per relay chain block:\n\n```javascript\nconst response = await fetch(\'/accounts/123/balance-info?at=5000000&useRcBlock=true\');\nconst data = await response.json();\n\n// Handle multiple Asset Hub blocks (future-ready)\ndata.forEach((block, index) => {\n console.log(`Asset Hub block ${index + 1}:`);\n console.log(`Block number: ${block.at.height}`);\n console.log(`RC block: ${block.rcBlockNumber}`);\n console.log(`Timestamp: ${block.ahTimestamp}`);\n});\n```\n\n## Backward Compatibility\n\n- **Regular queries** (without `useRcBlock`) continue to return single objects unchanged\n- **All existing functionality** remains the same for standard queries\n- **Only array structure** changes affect `useRcBlock` queries\n\n## Benefits\n\n1. **Asset Hub Migration Support**: Enables querying Asset Hub data using relay chain block references\n2. **Elastic Scaling Ready**: Prepared for multiple Asset Hub blocks per relay chain block\n3. **Consistent API**: All endpoints follow the same array response pattern\n4. **Predictable**: Empty arrays instead of errors when no blocks found\n\n## Examples\n\n### Single Result (Current Behavior)\n```bash\ncurl "https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/123/balance-info?at=20000000&useRcBlock=true"\n```\n\nResponse:\n```json\n[\n {\n "at": {\n "hash": "0x...",\n "height": "1234567"\n },\n "free": "1000000000000",\n "reserved": "0",\n "miscFrozen": "0",\n "feeFrozen": "0",\n "rcBlockNumber": "20000000",\n "ahTimestamp": "1705123456789"\n }\n]\n```\n\n### Empty Result (No Asset Hub Block Found)\n```bash\ncurl "https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/123/balance-info?at=999999999&useRcBlock=true"\n```\n\nResponse:\n```json\n[]\n```\n\n### Regular Query (Unchanged)\n```bash\ncurl "https://polkadot-asset-hub-public-sidecar.parity-chains.parity.io/accounts/123/balance-info"\n```\n\nResponse (unchanged):\n```json\n{\n "at": {\n "hash": "0x...",\n "height": "1234567"\n },\n "free": "1000000000000",\n "reserved": "0",\n "miscFrozen": "0",\n "feeFrozen": "0"\n}\n```\n\n## Historic Data Limitations\n\nThe `/pallets/staking/progress` endpoint currently does not support historic queries. This means you can only query the current staking progress state, and cannot retrieve historical staking progress data from past blocks.\n\nAll other endpoints will continue to work with just the primary node configuration (`SAS_SUBSTRATE_URL`).\n\n## Need Help?\n\nIf you encounter issues during migration, please:\n\n1. **First, verify multi-chain setup**: Ensure both Asset Hub and relay chain nodes are running and accessible\n2. **Check environment variables**: Verify `SAS_SUBSTRATE_URL` and `SAS_SUBSTRATE_MULTI_CHAIN_URL` are correctly configured\n3. **Test connectivity**: Ensure both WebSocket URLs are reachable from your Sidecar instance\n4. **Review array handling**: Update your client code to handle array responses when using `useRcBlock`\n5. **Check this guide**: Review the migration steps and examples above\n6. **Open an issue**: For persistent issues, create an issue on [GitHub](https://github.com/paritytech/substrate-api-sidecar/issues)\n\n**Remember**: The `useRcBlock` parameter requires both Asset Hub and relay chain APIs to be available and properly configured. Without proper multi-chain setup, these features will not work.\n\nThe changes enable Asset Hub migration support while preparing the API for future elastic scaling scenarios where multiple Asset Hub blocks could exist per relay chain block.\n'),"useRcBlock-spec":$('# Polkadot REST API: useRcBlock Query Parameters Specification\n\n## Prerequisites\nThe `useRcBlock` functionality requires two connection configurations:\n\n**Primary Connection (Asset Hub):**\n- `SAS_SUBSTRATE_URL`: Connection to Asset Hub node\n\n**Multi-Chain Connection (Relay Chain):**\n- `SAS_SUBSTRATE_MULTI_CHAIN_URL`: JSON array of chain configurations, each containing a `url` and `type` property. The `type` can be \'relay\', \'assethub\', \'parachain\', or undefined. Currently used for Asset Hub migration to query staking information and additional session/babe information from the relay chain. In future releases, this will also be used to improve performance by allowing Sidecar to retrieve information from multiple nodes. This environment variable should be used in combination with the `SAS_SUBSTRATE_URL` variable.\n\n**Example Configuration:**\n```\nSAS_SUBSTRATE_URL=wss://westend-asset-hub-rpc.polkadot.io\nSAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"wss://westend-rpc.polkadot.io","type":"relay"}]\'\n```\n\n## Query Parameters Overview\n\n### useRcBlock Parameter\nThe `useRcBlock` parameter is a boolean parameter that works in conjunction with the existing `at` parameter. When `useRcBlock=true`, the API queries relay chain data at the block specified by the `at` parameter, treating the `at` value as a relay chain block identifier instead of an Asset Hub block identifier.\n\n**Special Behavior**: When `useRcBlock=true` is used without an `at` parameter, the API will use the finalizedHead of the relay chain to get the associated Asset Hub block.\n\n**Block Finalization Note**: The `useRcBlock` parameter does not make any assumptions about whether the block you pass is finalized or a best block. It is recommended to ensure the block you are passing is finalized if block finalization is important for your use case.\n\n### format Parameter\nThe `format` parameter controls the response format when using `useRcBlock=true`. This parameter is only valid when `useRcBlock=true` is specified.\n\n**Values:**\n- `array` (default): Returns the standard array format with enhanced metadata\n- `object`: Wraps the response in an object containing relay chain block info and the parachain data array\n\n**Validation**: Using `format=object` without `useRcBlock=true` will return a `400 Bad Request` error.\n\n## Implementation: useRcBlock Query Parameter\n\n### Core Functionality\nThe `useRcBlock` parameter can be added to existing sidecar endpoints to query Asset Hub state using relay chain block identifiers.\n\n**Parameter Format:**\n```\nat=&useRcBlock=true\n```\n\n**Example Usage:**\n```\nGET /pallets/staking/progress?at=1000000&useRcBlock=true\nGET /accounts/{accountId}/balance-info?at=0x123abc&useRcBlock=true\nGET /blocks/head?useRcBlock=true\nGET /blocks/12345?at=12345&useRcBlock=true\n\n# With format=object for wrapped response format\nGET /pallets/staking/progress?at=1000000&useRcBlock=true&format=object\nGET /accounts/{accountId}/balance-info?at=0x123abc&useRcBlock=true&format=object\n```\n\n### Response Format Changes\n\n**Without useRcBlock (Traditional Behavior):**\nReturns single response object (unchanged):\n```json\n{\n // ... existing endpoint response data\n}\n```\n\n**With useRcBlock=true (default array format):**\nReturns array format with additional metadata:\n```json\n[{\n // ... existing endpoint response data\n "rcBlockHash": "0x1234567890abcdef...",\n "rcBlockNumber": "1000000",\n "ahTimestamp": "1642694400"\n}]\n```\n\nOr empty array `[]` if no corresponding Asset Hub block exists.\n\n**With useRcBlock=true&format=object:**\nReturns object format wrapping the data with relay chain block info:\n```json\n{\n "rcBlock": {\n "hash": "0x1234567890abcdef...",\n "parentHash": "0xabcdef1234567890...",\n "number": "1000000"\n },\n "parachainDataPerBlock": [\n {\n // ... existing endpoint response data\n "rcBlockHash": "0x1234567890abcdef...",\n "rcBlockNumber": "1000000",\n "ahTimestamp": "1642694400"\n }\n ]\n}\n```\n\nOr with empty `parachainDataPerBlock` array if no corresponding Asset Hub block exists:\n```json\n{\n "rcBlock": {\n "hash": "0x1234567890abcdef...",\n "parentHash": "0xabcdef1234567890...",\n "number": "1000000"\n },\n "parachainDataPerBlock": []\n}\n```\n\n## Supported Endpoints\n\n### Block Endpoints Supporting useRcBlock:\n\n1. **`/blocks/head`** - Get latest block using RC head block\n2. **`/blocks/head/header`** - Get latest block header using RC head block\n3. **`/blocks/{blockId}`** - Get single block by RC block identifier\n4. **`/blocks/{blockId}/header`** - Get block header by RC block identifier\n5. **`/blocks`** - Get block range where range represents RC block numbers (skips RC blocks without corresponding AH blocks)\n6. **`/blocks/{blockId}/extrinsics-raw`** - Get raw extrinsics by RC block identifier\n7. **`/blocks/{blockId}/extrinsics/{extrinsicIndex}`** - Get specific extrinsic by RC block identifier\n\n### Non-Block Endpoints Supporting useRcBlock:\nMost existing sidecar endpoints support the `useRcBlock` parameter, including:\n- `/pallets/*` endpoints\n- `/accounts/*` endpoints\n- Other state query endpoints\n\n## Key Features and Behavior\n\n### Enhanced Response Format\nWhen `useRcBlock=true` is used, responses include additional context fields:\n- `rcBlockHash`: The relay chain block hash\n- `rcBlockNumber`: The relay chain block number\n- `ahTimestamp`: The Asset Hub block timestamp\n- Array format (default) prepares for future elastic scaling scenarios\n- Object format (`format=object`) provides relay chain block metadata wrapper with `rcBlock` info (hash, parentHash, number) and `parachainDataPerBlock` array\n\n### Backward Compatibility\n- Defaults to `false`, maintaining existing functionality when not specified\n- Existing endpoints remain unchanged when `useRcBlock` is not used\n- No breaking changes to current API behavior\n\n### Graceful Handling\n- Range endpoints skip RC blocks without corresponding AH blocks\n- Returns empty array `[]` when no corresponding Asset Hub block exists\n- Multi-block scenarios are handled when Asset Hub produces multiple blocks within a single relay chain block period\n\n### Validation Logic\nThe `validateUseRcBlock` middleware ensures:\n1. **Boolean validation**: `useRcBlock` must be "true" or "false" string\n2. **Asset Hub requirement**: Only works when connected to Asset Hub\n3. **Relay chain availability**: Requires relay chain API configuration via `SAS_SUBSTRATE_MULTI_CHAIN_URL`\n4. **format dependency**: `format=object` requires `useRcBlock=true` to be specified\n5. **format values**: Must be either "array" or "object" string\n\n## Multi-Block and Elastic Scaling Scenarios\n\n### Multi-Block Scenarios\nWhen Asset Hub produces multiple blocks within a single relay chain block period (due to faster block times), the array response format accommodates multiple blocks. The array structure prepares the API for future elastic scaling requirements.\n\n### Elastic Scaling Preparation\nThe array response format is designed to support future elastic scaling scenarios where multiple Asset Hub blocks may be produced for a single relay chain block reference.\n\n---\n\n## Potential Future Enhancements\n\n### `enforceFinalizedBlockOnAt` Parameter (Suggested Safeguard)\n\nAn optional safeguard parameter `enforceFinalizedBlockOnAt` could be implemented to enforce that blocks passed via the at parameter are finalized. When `enforceFinalizedBlockOnAt=true`, the endpoint will error if the specified block is not finalized, providing additional safety for applications that require finalized block guarantees.\n'),"advanced-config":$('# Advanced Configuration Guide\n\nThis comprehensive guide covers all configuration options available in Polkadot REST API. All environment variables use the `SAS_` prefix for backwards compatibility with Substrate API Sidecar.\n\n## Table of Contents\n\n- [Server Configuration](#server-configuration)\n- [Substrate Node Connection](#substrate-node-connection)\n- [Logging Configuration](#logging-configuration)\n- [Metrics & Monitoring](#metrics--monitoring)\n- [Environment Profiles](#environment-profiles)\n- [Docker Configuration](#docker-configuration)\n\n## Server Configuration\n\nConfigure the HTTP server that serves the REST API.\n\n### Basic Server Settings\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_EXPRESS_BIND_HOST` | `127.0.0.1` | Network interface to bind to. **Use `0.0.0.0` for Docker** |\n| `SAS_EXPRESS_PORT` | `8080` | Port number (must be non-zero) |\n| `SAS_EXPRESS_KEEP_ALIVE_TIMEOUT` | `5000` | Keep-alive timeout in milliseconds |\n| `SAS_EXPRESS_REQUEST_LIMIT` | `512000` | Maximum request body size in bytes (500KB) |\n| `SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY` | `10` | Maximum concurrent block fetches for block range queries |\n\n> **Note:** The `SAS_EXPRESS_` prefix is an artifact of Substrate API Sidecar naming, preserved for backwards compatibility.\n\n**Example:**\n```bash\nexport SAS_EXPRESS_BIND_HOST=0.0.0.0\nexport SAS_EXPRESS_PORT=3000\nexport SAS_EXPRESS_KEEP_ALIVE_TIMEOUT=10000\nexport SAS_EXPRESS_REQUEST_LIMIT=1048576 # 1MB\nexport SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY=20\n```\n\n### Migrating from Sidecar\n\nThe following sidecar server variables are **not supported**:\n\n| Sidecar Variable | Status | Notes |\n|------------------|--------|-------|\n| `SAS_EXPRESS_MAX_BODY` | Replaced | Use `SAS_EXPRESS_REQUEST_LIMIT` (value in bytes, not a string like `100kb`) |\n| `SAS_EXPRESS_INJECTED_CONTROLLERS` | Not supported | Pallet-injected controllers are not available |\n\n## Substrate Node Connection\n\nConfigure connections to Substrate-based blockchain nodes.\n\n### Primary Node Connection\n\n| Variable | Required | Default | Description |\n|----------|----------|---------|-------------|\n| `SAS_SUBSTRATE_URL` | Yes | `ws://127.0.0.1:9944` | WebSocket or HTTP URL to node |\n\n**Supported protocols:** `ws://`, `wss://`, `http://`, `https://`\n\n### Reconnection Settings\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_SUBSTRATE_RECONNECT_INITIAL_DELAY_MS` | `100` | Initial delay before first reconnect attempt |\n| `SAS_SUBSTRATE_RECONNECT_MAX_DELAY_MS` | `10000` | Maximum delay between reconnect attempts (10s) |\n| `SAS_SUBSTRATE_RECONNECT_REQUEST_TIMEOUT_MS` | `30000` | Timeout for individual RPC requests (30s) |\n\n### Multi-Chain Configuration\n\nFor Asset Hub and multi-chain queries (e.g., `useRcBlock` functionality):\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `SAS_SUBSTRATE_MULTI_CHAIN_URL` | No | JSON array of chain configurations |\n\n**Format:**\n```json\n[{"url":"wss://relay-chain.com","type":"relay"}]\n```\n\n**Chain types:**\n- `relay` — Relay chain (Polkadot/Kusama)\n- `assethub` — Asset Hub parachain\n- `coretime` — Coretime chain\n- `parachain` — Other parachains (default)\n\n**Example configurations:**\n\n```bash\n# Single node (basic)\nexport SAS_SUBSTRATE_URL=wss://polkadot-rpc.polkadot.io\n\n# Asset Hub with relay chain (enables useRcBlock and RC endpoints)\nexport SAS_SUBSTRATE_URL=wss://polkadot-asset-hub-rpc.polkadot.io\nexport SAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"wss://polkadot-rpc.polkadot.io","type":"relay"}]\'\n\n# Local development\nexport SAS_SUBSTRATE_URL=ws://127.0.0.1:9944\nexport SAS_SUBSTRATE_MULTI_CHAIN_URL=\'[{"url":"ws://127.0.0.1:9945","type":"relay"}]\'\n```\n\n### Migrating from Sidecar\n\nThe following sidecar substrate variables are **not supported**:\n\n| Sidecar Variable | Status | Notes |\n|------------------|--------|-------|\n| `SAS_SUBSTRATE_TYPES_BUNDLE` | Not needed | subxt handles type resolution automatically |\n| `SAS_SUBSTRATE_TYPES_CHAIN` | Not needed | subxt handles type resolution automatically |\n| `SAS_SUBSTRATE_TYPES_SPEC` | Not needed | subxt handles type resolution automatically |\n| `SAS_SUBSTRATE_TYPES` | Not needed | subxt handles type resolution automatically |\n| `SAS_SUBSTRATE_CACHE_CAPACITY` | Not implemented | Uses a different caching strategy |\n\n## Logging Configuration\n\nControl logging behavior and output formatting.\n\n### Log Levels\n\n| Variable | Default | Options | Description |\n|----------|---------|---------|-------------|\n| `SAS_LOG_LEVEL` | `info` | `error`, `warn`, `info`, `http`, `debug`, `trace` | Minimum log level |\n\n**HTTP Status Code Mapping:**\n- `< 400` — `http` level\n- `400-499` — `warn` level\n- `>= 500` — `error` level\n\n### Log Formatting\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_LOG_JSON` | `false` | Output logs in JSON format |\n| `SAS_LOG_STRIP_ANSI` | `false` | Remove ANSI color codes |\n\n### File Logging\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_LOG_WRITE` | `false` | Write logs to file |\n| `SAS_LOG_WRITE_PATH` | `./logs` | Directory for log files |\n| `SAS_LOG_WRITE_MAX_FILE_SIZE` | `5242880` | Max file size in bytes (5MB). Minimum: 1024 (1KB) |\n| `SAS_LOG_WRITE_MAX_FILES` | `5` | Max number of log files (minimum: 1) |\n\n**Example configurations:**\n\n```bash\n# Development logging\nexport SAS_LOG_LEVEL=debug\nexport SAS_LOG_JSON=false\n\n# Production logging\nexport SAS_LOG_LEVEL=info\nexport SAS_LOG_JSON=true\nexport SAS_LOG_WRITE=true\nexport SAS_LOG_WRITE_PATH=/var/log/polkadot-rest-api\n\n# Verbose debugging\nexport SAS_LOG_LEVEL=trace\nexport SAS_LOG_STRIP_ANSI=true\n```\n\n### Migrating from Sidecar\n\n| Sidecar Variable | Status | Notes |\n|------------------|--------|-------|\n| `SAS_LOG_FILTER_RPC` | Not implemented | polkadot-js API-WS RPC filtering is not applicable (uses subxt, not polkadot-js) |\n| `SAS_LOG_LEVEL=silly` | Not supported | Use `trace` instead (most verbose level) |\n| `SAS_LOG_LEVEL=verbose` | Not supported | Use `debug` instead |\n\n## Metrics & Monitoring\n\nEnable Prometheus metrics and Loki logging integration.\n\n### Metrics Server\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_METRICS_ENABLED` | `false` | Enable metrics collection |\n| `SAS_METRICS_PROM_HOST` | `127.0.0.1` | Prometheus server host (IP address or hostname) |\n| `SAS_METRICS_PROM_PORT` | `9100` | Prometheus server port |\n| `SAS_METRICS_PROMETHEUS_PREFIX` | `polkadot_rest_api` | Prometheus metric name prefix |\n| `SAS_METRICS_INCLUDE_QUERYPARAMS` | `false` | Include query params in metrics labels |\n\n### Loki Integration\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SAS_METRICS_LOKI_HOST` | `127.0.0.1` | Loki server host (IP address or hostname) |\n| `SAS_METRICS_LOKI_PORT` | `3100` | Loki server port |\n\n### Metrics Endpoints\n\nWhen `SAS_METRICS_ENABLED=true`, the following endpoints become available:\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET /metrics` | Prometheus text format |\n| `GET /metrics.json` | JSON format |\n\n### Prometheus Prefix\n\nThe `SAS_METRICS_PROMETHEUS_PREFIX` must follow Prometheus naming conventions:\n- Must start with `[a-zA-Z_:]`\n- May contain only `[a-zA-Z0-9_:]`\n- Default: `polkadot_rest_api` (all metrics are prefixed, e.g., `polkadot_rest_api_http_requests_total`)\n\n**Example setup:**\n\n```bash\n# Enable metrics\nexport SAS_METRICS_ENABLED=true\nexport SAS_METRICS_PROM_PORT=9090\nexport SAS_METRICS_INCLUDE_QUERYPARAMS=true\n\n# With external monitoring stack\nexport SAS_METRICS_PROM_HOST=prometheus.monitoring.svc\nexport SAS_METRICS_LOKI_HOST=loki.monitoring.svc\n\n# Custom prefix\nexport SAS_METRICS_PROMETHEUS_PREFIX=my_api\n```\n\n## Environment Profiles\n\nUse different configuration profiles for various environments.\n\n### Using .env Files\n\nPolkadot REST API supports loading configuration from `.env` files using the `--env-file` CLI argument:\n\n```bash\n# Use a specific env file\npolkadot-rest-api --env-file .env.production\n\n# Default: looks for .env in the current directory\npolkadot-rest-api\n```\n\n### Example Profiles\n\n**.env.local (Development):**\n```bash\nSAS_SUBSTRATE_URL=ws://127.0.0.1:9944\nSAS_EXPRESS_BIND_HOST=127.0.0.1\nSAS_EXPRESS_PORT=8080\nSAS_LOG_LEVEL=debug\nSAS_METRICS_ENABLED=false\n```\n\n**.env.production (Production):**\n```bash\nSAS_SUBSTRATE_URL=wss://polkadot-rpc.polkadot.io\nSAS_EXPRESS_BIND_HOST=0.0.0.0\nSAS_EXPRESS_PORT=8080\nSAS_LOG_LEVEL=info\nSAS_LOG_JSON=true\nSAS_LOG_WRITE=true\nSAS_LOG_WRITE_PATH=/var/log/polkadot-rest-api\nSAS_METRICS_ENABLED=true\nSAS_EXPRESS_KEEP_ALIVE_TIMEOUT=30000\n```\n\n**.env.docker (Docker):**\n```bash\nSAS_SUBSTRATE_URL=ws://host.docker.internal:9944\nSAS_EXPRESS_BIND_HOST=0.0.0.0\nSAS_EXPRESS_PORT=8080\nSAS_LOG_JSON=true\n```\n\n## Docker Configuration\n\n### Dockerfile\n\nThe project uses a multi-stage build:\n\n1. **Build stage**: `rust:1.90.0-slim-bookworm` — compiles the release binary\n2. **Runtime stage**: `debian:bookworm-slim` — minimal image with only `ca-certificates`\n\nThe final image runs as the `nobody` user and includes these defaults:\n- `RUST_LOG=info`\n- `SAS_EXPRESS_PORT=8080`\n- `SAS_EXPRESS_BIND_HOST=0.0.0.0`\n\n### Running with Docker\n\n```bash\n# Pull the image\ndocker pull docker.io/parity/polkadot-rest-api:latest\n\n# Run with defaults (connects to host node)\ndocker run --rm -it --read-only -p 8080:8080 \\\n -e SAS_SUBSTRATE_URL=ws://host.docker.internal:9944 \\\n parity/polkadot-rest-api\n\n# Run with env file\ndocker run --rm -it --read-only --env-file .env.docker -p 8080:8080 \\\n parity/polkadot-rest-api\n```\n\n> **Tip**: Always use `--read-only` for containers in production.\n\n### Docker Compose\n\nThe `docker-compose.yml` provides a full stack with monitoring:\n\n```yaml\nservices:\n polkadot: # Polkadot node\n rest-api: # Polkadot REST API\n loki: # Log aggregation\n cadvisor: # Container metrics\n prometheus: # Metrics storage\n grafana: # Dashboards (admin/admin)\n```\n\n**Quick start:**\n```bash\ndocker-compose up\n```\n\nThis starts:\n- Polkadot node syncing via warp sync on port `9944`\n- REST API on port `8080` (connected to local node)\n- Loki on port `3100`\n- cAdvisor on port `8081`\n- Prometheus on port `9090`\n- Grafana on port `3000` (default credentials: `admin`/`admin`)\n\n### Docker Networking Notes\n\n- The Dockerfile sets `SAS_EXPRESS_BIND_HOST=0.0.0.0` by default — no need to override\n- Use Docker service names for inter-container communication (e.g., `ws://polkadot:9944`)\n- Use `host.docker.internal` to access services on the Docker host\n\n### Migrating from Sidecar Docker Setup\n\n| Change | Details |\n|--------|---------|\n| **Image name** | `parity/substrate-api-sidecar` → `parity/polkadot-rest-api` |\n| **Service name** | `sidecar` → `rest-api` (in docker-compose) |\n| **Base image** | Node.js Alpine → Debian slim (smaller runtime, no Node.js needed) |\n| **Run user** | `node` → `nobody` |\n| **Bind host** | Must set `SAS_EXPRESS_BIND_HOST=0.0.0.0` via env | Set in Dockerfile by default |\n| **Health check** | `curl http://localhost:8080/blocks/head` → `curl http://localhost:8080/v1/blocks/head` |\n| **Prometheus port** | Separate port `9100` exposed | Served on main port at `/metrics` |\n\n## Configuration Validation\n\nThe API validates all configuration on startup and will exit with an error if any value is invalid.\n\n### Testing Configuration\n\n```bash\n# Test the API is running\ncurl http://localhost:8080/v1/blocks/head\n\n# Check health\ncurl http://localhost:8080/v1/health\n\n# Check metrics (if enabled)\ncurl http://localhost:8080/metrics\n\n# Verify node connection\ncurl http://localhost:8080/v1/node/version\n\n# Check API version\ncurl http://localhost:8080/v1/version\n\n# Check capabilities (supported pallets, chain type)\ncurl http://localhost:8080/v1/capabilities\n```\n\n### Common Issues\n\n**Connection refused:**\n- Check `SAS_SUBSTRATE_URL` is reachable\n- Verify WebSocket/HTTP protocol matches the node\n\n**Docker networking:**\n- The Dockerfile sets `SAS_EXPRESS_BIND_HOST=0.0.0.0` by default\n- Check port mapping: `-p host_port:container_port`\n\n**Invalid configuration:**\n- All env vars are validated on startup — check the error message\n- `SAS_EXPRESS_PORT` must be non-zero\n- `SAS_EXPRESS_REQUEST_LIMIT` must be non-zero\n- `SAS_LOG_LEVEL` must be one of: `trace`, `debug`, `http`, `info`, `warn`, `error`\n- `SAS_METRICS_PROMETHEUS_PREFIX` must follow Prometheus naming: start with `[a-zA-Z_:]`, contain only `[a-zA-Z0-9_:]`\n\n**Performance tuning:**\n- Increase `SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY` for faster block range queries (default: 10)\n- Tune `SAS_EXPRESS_KEEP_ALIVE_TIMEOUT` for long-running connections (default: 5000ms)\n- Adjust `SAS_SUBSTRATE_RECONNECT_*` values for unreliable RPC connections\n\n## Complete Example\n\nFull production configuration:\n\n```bash\n#!/bin/bash\n# Production Polkadot REST API Configuration\n\n# Server\nexport SAS_EXPRESS_BIND_HOST=0.0.0.0\nexport SAS_EXPRESS_PORT=8080\nexport SAS_EXPRESS_KEEP_ALIVE_TIMEOUT=30000\nexport SAS_EXPRESS_REQUEST_LIMIT=512000\nexport SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY=20\n\n# Blockchain connection\nexport SAS_SUBSTRATE_URL=wss://polkadot-rpc.polkadot.io\n\n# Reconnection\nexport SAS_SUBSTRATE_RECONNECT_INITIAL_DELAY_MS=100\nexport SAS_SUBSTRATE_RECONNECT_MAX_DELAY_MS=10000\nexport SAS_SUBSTRATE_RECONNECT_REQUEST_TIMEOUT_MS=30000\n\n# Asset Hub multi-chain setup\nexport SAS_SUBSTRATE_MULTI_CHAIN_URL=\'[\n {"url":"wss://polkadot-rpc.polkadot.io","type":"relay"}\n]\'\n\n# Logging\nexport SAS_LOG_LEVEL=info\nexport SAS_LOG_JSON=true\nexport SAS_LOG_WRITE=true\nexport SAS_LOG_WRITE_PATH=/var/log/polkadot-rest-api\nexport SAS_LOG_WRITE_MAX_FILE_SIZE=10485760 # 10MB\nexport SAS_LOG_WRITE_MAX_FILES=10\n\n# Metrics\nexport SAS_METRICS_ENABLED=true\nexport SAS_METRICS_PROM_HOST=0.0.0.0\nexport SAS_METRICS_PROM_PORT=9100\nexport SAS_METRICS_PROMETHEUS_PREFIX=polkadot_rest_api\nexport SAS_METRICS_LOKI_HOST=loki.monitoring.svc\nexport SAS_METRICS_LOKI_PORT=3100\n\n# Start\npolkadot-rest-api\n```\n\n---\n\nFor migration details from Substrate API Sidecar, see the [Migration Guide](./MIGRATION.md).\n'),"openapi-utoipa":$('# OpenAPI Documentation with utoipa\n\nThis project uses [utoipa](https://github.com/juhaku/utoipa) v5 to generate an OpenAPI 3.0 spec from handler annotations. The spec is served as interactive Swagger UI at `/docs` and raw JSON at `/api-docs/openapi.json`.\n\n## How it works\n\n1. Each handler function has a `#[utoipa::path(...)]` attribute describing its HTTP method, path, parameters, and responses.\n2. The macro generates a hidden `__path_` struct in the same module as the handler.\n3. `crates/server/src/openapi.rs` aggregates all handlers via `#[derive(OpenApi)]` with a `paths(...)` list.\n4. `crates/server/src/app.rs` serves the generated spec at `/api-docs/openapi.json` and a static Swagger UI page at `/docs`.\n\n## Adding a new endpoint\n\n### 1. Annotate the handler function\n\nAdd `#[utoipa::path(...)]` directly above your `pub async fn`. Pick the template that matches your handler type.\n\n**GET with path + query params:**\n\n```rust\n#[utoipa::path(\n get,\n path = "/v1/my-category/{myId}",\n tag = "my-category",\n summary = "Short title for Swagger UI sidebar",\n description = "Longer description shown when the endpoint is expanded.",\n params(\n ("myId" = String, Path, description = "The resource identifier"),\n ("at" = Option, Query, description = "Block identifier (number or hash)"),\n ("flag" = Option, Query, description = "Some boolean toggle"),\n ),\n responses(\n (status = 200, description = "Success", body = Object),\n (status = 400, description = "Invalid request"),\n (status = 500, description = "Internal server error"),\n )\n)]\npub async fn my_handler(...) -> ... { ... }\n```\n\n**POST with JSON body:**\n\n```rust\n#[utoipa::path(\n post,\n path = "/v1/transaction/my-action",\n tag = "transaction",\n summary = "Do something",\n description = "Does something with the submitted data.",\n request_body(content = Object, description = "JSON body with \'tx\' field"),\n responses(\n (status = 200, description = "Success", body = Object),\n (status = 400, description = "Invalid input"),\n )\n)]\npub async fn my_action(...) -> ... { ... }\n```\n\n**GET with no params:**\n\n```rust\n#[utoipa::path(\n get,\n path = "/v1/health",\n tag = "health",\n summary = "Health check",\n description = "Returns service health status.",\n responses(\n (status = 200, description = "Healthy", body = Object),\n )\n)]\npub async fn get_health(...) -> ... { ... }\n```\n\n> **Note on `body = Object`:** Most handlers return dynamic `serde_json::Value` data, so use `body = Object`. Only use a concrete type (e.g., `body = HealthResponse`) if the response struct derives `utoipa::ToSchema`.\n\n### 2. Ensure the handler\'s module is `pub mod`\n\nThe `#[utoipa::path]` macro generates a hidden struct `__path_` in the same module as the handler. This struct must be accessible from `openapi.rs`. If the module is declared as `mod my_handler;` (private), change it to `pub mod my_handler;` in the parent `mod.rs`.\n\n```rust\n// crates/server/src/handlers/my_category/mod.rs\n\npub mod my_handler; // must be `pub mod`, NOT `mod`\n\npub use my_handler::my_handler; // re-export is fine but doesn\'t help utoipa\n```\n\n### 3. Register the handler in `openapi.rs`\n\nAdd the handler\'s **full submodule path** to the `paths(...)` list in `crates/server/src/openapi.rs`.\n\n```rust\npaths(\n // ... existing paths ...\n\n // Use the FULL module path, not the re-exported name\n crate::handlers::my_category::my_handler_file::my_handler,\n)\n```\n\n**Critical:** Always use the path to the actual module file, not the re-exported path. `pub use` re-exports the function but NOT the `__path_*` struct that utoipa needs.\n\n```rust\n// WRONG - utoipa can\'t find __path_my_handler at this path\ncrate::handlers::my_category::my_handler,\n\n// CORRECT - utoipa finds __path_my_handler in the submodule\ncrate::handlers::my_category::my_handler_file::my_handler,\n```\n\n### 4. Pick the right tag\n\nUse an existing tag from `openapi.rs` so the endpoint groups properly in Swagger UI:\n\n| Tag | Use for |\n|-----|---------|\n| `health` | Health check endpoints |\n| `node` | Node version, network, tx pool |\n| `version` | API version |\n| `blocks` | Block queries |\n| `accounts` | Account balance, staking, proxy, vesting |\n| `pallets` | Pallet storage, consts, errors, events, dispatchables |\n| `runtime` | Runtime spec, metadata, code |\n| `transaction` | Submit, dry-run, fee-estimate, material |\n| `coretime` | Coretime info, leases, regions, renewals, reservations |\n| `paras` | Parachain inclusion |\n| `ahm` | Asset Hub Migration |\n| `capabilities` | API capabilities |\n| `rc` | All relay chain (`/rc/...`) endpoints |\n\nIf you need a new tag, add it to the `tags(...)` block in `openapi.rs`.\n\n### 5. Build and verify\n\n```bash\ncargo build --package polkadot-rest-api\ncargo test --package polkadot-rest-api\n```\n\nIf you get `could not find __path_`, check:\n1. Is the module `pub mod` in its parent `mod.rs`?\n2. Does the path in `openapi.rs` point to the **actual submodule**, not the re-exported name?\n\n**The sync test will catch you if you forget.** A test in `openapi.rs` (`openapi_paths_match_registered_routes`) automatically compares the route registry against the OpenAPI spec. It runs as part of `cargo test --package polkadot-rest-api` and will fail with a message like:\n\n```\nRoutes registered but MISSING from OpenAPI spec:\n - GET /v1/my-category/{}\n```\n\nThis means a route exists in `routes/*.rs` but has no matching `#[utoipa::path]` annotation (or isn\'t registered in `openapi.rs`). The reverse case — a path in the spec with no registered route — is also caught.\n\n## Checklist\n\n- [ ] `#[utoipa::path(...)]` added above the handler function\n- [ ] Module is `pub mod` (not private `mod`) in parent `mod.rs`\n- [ ] Full submodule path added to `paths(...)` in `openapi.rs`\n- [ ] `path =` matches the actual route registered in `routes/*.rs`\n- [ ] `tag =` uses an existing tag (or you added a new one)\n- [ ] `cargo build --package polkadot-rest-api` compiles\n- [ ] Swagger UI at `/docs` shows the new endpoint\n\n## Architecture notes\n\n### Why not utoipa-swagger-ui?\n\n`utoipa-swagger-ui` v9 targets axum 0.8. This project uses axum 0.7. Instead, the Swagger UI is served as a static HTML page (`crates/server/src/swagger_ui.html`) that loads Swagger UI from the unpkg CDN (`unpkg.com/swagger-ui-dist@5`). The OpenAPI JSON is served via a plain Axum route.\n\n### Why full submodule paths?\n\n`#[utoipa::path]` generates `__path_` in the handler\'s module. A `pub use handler::fn_name` in `mod.rs` re-exports the function but **not** the generated struct. The `#[derive(OpenApi)]` macro needs the struct, so paths in `openapi.rs` must point to the actual submodule where the struct lives.\n\n### Key files\n\n| File | Purpose |\n|------|---------|\n| `crates/server/src/openapi.rs` | Central `#[derive(OpenApi)]` — registers all paths and tags |\n| `crates/server/src/app.rs` | Mounts `/api-docs/openapi.json` and `/docs` routes |\n| `crates/server/src/swagger_ui.html` | Static Swagger UI page (CDN-based) |\n| `crates/server/Cargo.toml` | `utoipa = { version = "5", features = ["axum_extras"] }` |\n'),"adding-benchmarks":$('# Adding Benchmarks for New Endpoints\n\nQuick guide to add performance benchmarks for new API endpoints.\n\n## 📋 Overview\n\nEach endpoint benchmark consists of:\n- **Directory**: `benchmarks/your_endpoint/`\n- **Runner script**: `init.sh` (configures and runs wrk)\n- **Lua script**: `your_endpoint.lua` (defines HTTP requests)\n- **Configuration**: Entry in `benchmark_config.json`\n\nThe CI automatically discovers and runs all benchmarks.\n\n## 📝 Step-by-Step\n\n### 1. Create the Lua Script\n\nCreate `benchmarks/blocks/blocks.lua`:\n\n```lua\n-- Blocks endpoint benchmark\nrequest = function()\n local block_id = math.random(1000000, 5000000)\n return wrk.format("GET", "/blocks/" .. block_id)\nend\n```\n\n### 2. Create the Runner Script\n\nCreate `benchmarks/blocks/init.sh`:\n\n```bash\n#!/bin/bash\n\nset -e\n\nSCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"\nPROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"\nCONFIG_FILE="$PROJECT_ROOT/benchmark_config.json"\n\nSCENARIO="${1:-light_load}"\nHARDWARE_PROFILE="${2:-ci_runner}"\n\n# Validate hardware profile\nif ! jq -e ".hardware_profiles.\\"$HARDWARE_PROFILE\\"" "$CONFIG_FILE" > /dev/null; then\n echo "Error: Hardware profile \'$HARDWARE_PROFILE\' not found"\n exit 1\nfi\n\n# Get benchmark configuration\nTHREADS=$(jq -r ".benchmarks.blocks.scenarios[] | select(.name == \\"$SCENARIO\\") | .threads" "$CONFIG_FILE")\nCONNECTIONS=$(jq -r ".benchmarks.blocks.scenarios[] | select(.name == \\"$SCENARIO\\") | .connections" "$CONFIG_FILE")\nDURATION=$(jq -r ".benchmarks.blocks.scenarios[] | select(.name == \\"$SCENARIO\\") | .duration" "$CONFIG_FILE")\nTIMEOUT=$(jq -r ".benchmarks.blocks.scenarios[] | select(.name == \\"$SCENARIO\\") | .timeout" "$CONFIG_FILE")\n\nif [ -z "$THREADS" ] || [ "$THREADS" == "null" ]; then\n echo "Error: Scenario \'$SCENARIO\' not found"\n exit 1\nfi\n\nSERVER_HOST=$(jq -r \'.server.host\' "$CONFIG_FILE")\nSERVER_PORT=$(jq -r \'.server.port\' "$CONFIG_FILE")\n\necho "Running blocks endpoint benchmark: $SCENARIO"\necho "Configuration: threads=$THREADS, connections=$CONNECTIONS, duration=$DURATION"\n\n# Run wrk benchmark\ncd "$SCRIPT_DIR"\nwrk -d"$DURATION" -t"$THREADS" -c"$CONNECTIONS" --timeout "${TIMEOUT:-120s}" --latency \\\n -s ./blocks.lua "http://$SERVER_HOST:$SERVER_PORT"\n```\n\n### 3. Add Configuration\n\nAdd your endpoint to `benchmark_config.json`. You can either use standard scenarios or define custom ones:\n\n#### Option 1: Use Standard Scenarios\n\nWhen `use_standard_scenarios` is set to `true`, your endpoint will automatically use the predefined standard scenarios:\n\n```json\n{\n "benchmarks": {\n "blocks": {\n "endpoint": "/blocks/:block_id",\n "use_standard_scenarios": true\n }\n }\n}\n```\n\nThis will use the following standard scenarios defined in `benchmark_config.json`:\n\n```json\n{\n "standard_scenarios": [\n {\n "name": "light_load",\n "description": "Light load testing - suitable for development and CI",\n "threads": 2,\n "connections": 10,\n "duration": "30s",\n "timeout": "60s"\n },\n {\n "name": "medium_load",\n "description": "Medium load testing - balanced performance test",\n "threads": 4,\n "connections": 50,\n "duration": "60s",\n "timeout": "120s"\n },\n {\n "name": "heavy_load",\n "description": "Heavy load testing - high performance test",\n "threads": 8,\n "connections": 100,\n "duration": "120s",\n "timeout": "180s"\n },\n {\n "name": "stress_test",\n "description": "Stress testing - maximum load test",\n "threads": 12,\n "connections": 200,\n "duration": "300s",\n "timeout": "360s"\n }\n ]\n}\n```\n\n#### Option 2: Define Custom Scenarios\n\nWhen you need specific performance parameters for your endpoint, you can define custom scenarios. Set `use_standard_scenarios` to `false` and provide your own `custom_scenarios` array:\n\n```json\n{\n "benchmarks": {\n "your_endpoint": {\n "endpoint": "/your/endpoint/path",\n "use_standard_scenarios": false,\n "custom_scenarios": [\n {\n "name": "scenario_name",\n "description": "Description of this scenario",\n "threads": ,\n "connections": ,\n "duration": "s",\n "timeout": "s"\n }\n ]\n }\n }\n}\n```\n\nEach custom scenario must include:\n- **`name`**: Unique identifier for the scenario (e.g., "light_load", "medium_load")\n- **`description`**: Human-readable description of what this scenario tests\n- **`threads`**: Number of threads to use in wrk\n- **`connections`**: Number of concurrent connections to maintain\n- **`duration`**: How long to run the test (e.g., "30s", "60s", "120s")\n- **`timeout`**: Request timeout (e.g., "60s", "120s", "180s")\n\n**Note**: The benchmark scripts will first check for custom scenarios, then fall back to standard scenarios if not found. This allows you to override specific scenarios while keeping others standard.\n'),migration:$('# Migration Guide\n\n\n## Substrate API Sidecar v20.14.0 to Polkadot REST API\nThis guide documents breaking changes and differences between [substrate-api-sidecar](https://github.com/paritytech/substrate-api-sidecar) and this new Rust-based Polkadot REST API implementation.\n\n## Overview\n\nThis project is a Rust-based alternative to substrate-api-sidecar, designed to provide improved performance, memory safety, and better resource utilization. While we aim to maintain API compatibility where possible, some breaking changes are necessary for architectural improvements.\n\n## Public Instances\n\nParity hosts public instances of the Polkadot REST API for the following chains:\n\n| Chain | URL |\n|-------|-----|\n| **Polkadot** | https://polkadot-relay-rest-api.parity.io/v1 |\n| **Kusama** | https://kusama-relay-rest-api.parity.io/v1 |\n| **Westend** | https://westend-relay-rest-api.parity.io/v1 |\n| **Polkadot Asset Hub** | https://polkadot-hub-rest-api.parity.io/v1 |\n| **Kusama Asset Hub** | https://kusama-hub-rest-api.parity.io/v1 |\n| **Westend Asset Hub** | https://westend-hub-rest-api.parity.io/v1 |\n\nInteractive API documentation is available at `/docs` on each instance (e.g., [Polkadot Docs](https://polkadot-relay-rest-api.parity.io/docs)).\n\n**Usage Limits & Production Warning**\n\nThese public instances are subject to rate limiting and are not intended for production use. For consistent testing or development, it is highly recommended to implement a retry strategy (e.g., exponential backoff) to handle potential request throttling gracefully.\n\n---\n\n## ⚠️ Breaking Changes ⚠️\n\n### URL prefix\n\nAll API endpoints are now versioned under the `/v1` prefix.\n\n| Sidecar | Polkadot REST API |\n|---------|-------------------|\n| `GET /blocks/head` | `GET /v1/blocks/head` |\n| `GET /accounts/{id}/balance-info` | `GET /v1/accounts/{id}/balance-info` |\n| `POST /transaction` | `POST /v1/transaction` |\n\nUpdate all client URLs by prepending `/v1` to existing paths.\n\n### Coretime endpoint changes\n\n- **Renamed field**: `palletVersion` → `storageVersion` in `coretime/info`, to match current naming. See [commit](https://github.com/paritytech/polkadot-sdk/commit/4fe55f0bcb8edccaad73b33b804c349a756f7d3c).\n- **Renamed field**: `type` → `lifecycle` in `coretime/overview`, to match the on-chain type (`ParaLifecycle` enum, `ParaLifecycles` storage, `fn lifecycle()` accessor).\n- **Numeric fields**: All u16 and u32 fields are now returned as numbers instead of strings. This is an intentional divergence to provide more accurate JSON types, while maintaining safety for large values (u128 is still returned as a string).\n- **HTTP status codes**: Error responses (e.g., pallet missing at a requested block) now return 400 or 404 instead of 500.\n- **Price fix**: `/v1/coretime/info` — The `currentCorePrice` calculation has been corrected. The previous calculation was faulty. See [PR #175](https://github.com/paritytech/polkadot-rest-api/pull/175).\n- **Removed field**: The field `paraId` was removed from the response of `/v1/coretime/overview`. See [PR #251](https://github.com/paritytech/polkadot-rest-api/pull/251).\n\n### Query parameter changes\n\n| Parameter | Sidecar | Polkadot REST API | Notes |\n|-----------|---------|-------------------|-------|\n| `useRcBlockFormat` | Supported (`array` or `object`) | Use `format=object` instead | Sidecar\'s `useRcBlockFormat=object` is equivalent to `format=object` combined with `useRcBlock=true`. Sidecar\'s `useRcBlockFormat=array` (or omitting the parameter) is the default behavior — no extra parameter needed. |\n\n### Asset balance endpoints no longer return zero balances by default\n\nThe following endpoints now **exclude assets with zero balance** by default:\n\n- `GET /v1/accounts/{accountId}/asset-balances`\n- `GET /v1/accounts/{accountId}/pool-asset-balances`\n- `GET /v1/accounts/{accountId}/foreign-asset-balances`\n\nTo include zero-balance assets (previous behavior), use the `showEmpty=true` query parameter:\n\n```\nGET /v1/accounts/{accountId}/asset-balances?showEmpty=true\nGET /v1/accounts/{accountId}/pool-asset-balances?showEmpty=true\nGET /v1/accounts/{accountId}/foreign-asset-balances?showEmpty=true\n```\n\nThis change improves performance by reducing response payload size for accounts with many registered assets but few actual holdings.\n\n**Migration example:**\n\n```\n# Sidecar — object format\nGET /blocks/12345?useRcBlock=true&useRcBlockFormat=object\n\n# Polkadot REST API — equivalent\nGET /v1/blocks/12345?useRcBlock=true&format=object\n```\n\nBoth produce the same response structure:\n\n```json\n{\n "rcBlock": {\n "hash": "0x...",\n "parentHash": "0x...",\n "number": "12345"\n },\n "parachainDataPerBlock": [\n { /* Asset Hub block data with rcBlockHash, rcBlockNumber, ahTimestamp */ }\n ]\n}\n```\n\n```\n# Sidecar — array format (default)\nGET /blocks/12345?useRcBlock=true\n\n# Polkadot REST API — equivalent (same, no extra parameter)\nGET /v1/blocks/12345?useRcBlock=true\n```\n\nBoth return an array of Asset Hub blocks (or `[]` if none found).\n\n---\n\n### Response Differences\n\n#### Pallet metadata `args` field — simplified type names\n\nThe `args` field in pallet metadata responses (e.g., `/v1/pallets/{palletId}/events`, `/v1/pallets/{palletId}/errors`) returns **simplified type names** instead of fully expanded type definitions. This applies to any endpoint that exposes type arguments for pallet items.\n\n#### Example Responses\n\n**Polkadot REST API:**\n```json\n{\n "args": ["DispatchInfo"]\n}\n```\n```json\n{\n "args": ["DispatchError", "DispatchInfo"]\n}\n```\n\n**Sidecar (expanded definitions):**\n```json\n{\n "args": ["{\\"weight\\":\\"SpWeightsWeightV2Weight\\",\\"class\\":\\"FrameSupportDispatchDispatchClass\\",\\"paysFee\\":\\"FrameSupportDispatchPays\\"}"]\n}\n```\n```json\n{\n "args": [\n "{\\"_enum\\":{\\"Other\\":\\"Null\\",\\"CannotLookup\\":\\"Null\\",\\"BadOrigin\\":\\"Null\\",\\"Module\\":\\"SpRuntimeModuleError\\",...}}",\n "{\\"weight\\":\\"SpWeightsWeightV2Weight\\",\\"class\\":\\"FrameSupportDispatchDispatchClass\\",\\"paysFee\\":\\"FrameSupportDispatchPays\\"}"\n ]\n}\n```\n\n**This is an intentional difference.** Resolving types to the fully expanded Polkadot.js-style structure introduces significant complexity and fragility for minimal benefit. The simplified type names are the canonical names from the runtime metadata and are sufficient to identify the type. Consumers needing the full type definition can look it up from the runtime metadata directly.\n\n---\n\n## Fixes\n\n### Historical data with `?at=`\n\nThe following endpoints now return historical data when using the `?at=` query parameter. Sidecar\'s implementation returned current state regardless of the `at` parameter:\n - `/v1/pallets/assets/{assetId}/asset-info`\n - `/v1/pallets/asset-conversion/liquidity-pools`\n - `/v1/pallets/asset-conversion/next-available-id`\n - `/v1/pallets/pool-assets/{assetId}/asset-info`\n - `/v1/pallets/foreign-assets`\n\n---\n\n## Endpoints not available in Polkadot REST API\n\nThe following sidecar endpoints do **not** have equivalents in this project:\n\n### Experimental / trace endpoints\n\n| Sidecar endpoint | Status |\n|------------------|--------|\n| `GET /experimental/blocks/head/traces` | Not implemented |\n| `GET /experimental/blocks/{blockId}/traces` | Not implemented |\n| `GET /experimental/blocks/head/traces/operations` | Not implemented |\n| `GET /experimental/blocks/{blockId}/traces/operations` | Not implemented |\n| `GET /experimental/rc/blocks/head/traces` | Not implemented |\n| `GET /experimental/rc/blocks/{blockId}/traces` | Not implemented |\n| `GET /experimental/rc/blocks/head/traces/operations` | Not implemented |\n| `GET /experimental/rc/blocks/{blockId}/traces/operations` | Not implemented |\n\n### Ink! contracts\n\n| Sidecar endpoint | Status |\n|------------------|--------|\n| `POST /contracts/ink/{address}/query` | Not implemented |\n\n### Parachain endpoints\n\nMost parachain-specific endpoints from sidecar are not implemented. Only parachain head inclusion is available:\n\n| Sidecar endpoint | Polkadot REST API | Status |\n|------------------|-------------------|--------|\n| `GET /paras` | — | Not implemented |\n| `GET /paras/{paraId}/crowdloan-info` | — | Not implemented (crowdloans deprecated) |\n| `GET /paras/{paraId}/lease-info` | — | Not implemented |\n| `GET /paras/auctions/current` | — | Not implemented (auctions deprecated) |\n| `GET /paras/crowdloans` | — | Not implemented (crowdloans deprecated) |\n| `GET /paras/head/backed-candidates` | — | Not implemented |\n| `GET /paras/head/included-candidates` | — | Not implemented |\n| `GET /paras/leases/current` | — | Not implemented |\n| `GET /paras/{paraId}/head-inclusions` | `GET /v1/paras/{paraId}/head-inclusions` | Available |\n\n> **Note:** Crowdloan and auction endpoints are deprecated on-chain (crowdloans have been superseded by Coretime). These are intentionally not ported.\n\n---\n\n## New endpoints (not in Sidecar)\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET /v1/version` | Returns the running Polkadot REST API version |\n| `GET /v1/capabilities` | Returns supported pallets, chain type, and SS58 prefix |\n| `GET /api-docs/openapi.json` | Auto-generated OpenAPI 3.0 spec |\n| `GET /docs/` | Interactive documentation UI |\n\n---\n\n## Configuration changes\n\nBoth projects use environment variables with the `SAS_` prefix. Most variables are compatible.\n\n### Supported in both\n\n| Variable | Default | Purpose |\n|----------|---------|---------|\n| `SAS_SUBSTRATE_URL` | `ws://127.0.0.1:9944` | Primary RPC endpoint |\n| `SAS_EXPRESS_PORT` | `8080` | HTTP server port |\n| `SAS_EXPRESS_BIND_HOST` | `127.0.0.1` | Bind address |\n| `SAS_EXPRESS_KEEP_ALIVE_TIMEOUT` | `5000` | Keep-alive timeout (ms) |\n| `SAS_LOG_LEVEL` | `info` | Log level |\n| `SAS_LOG_JSON` | `false` | JSON log output |\n| `SAS_LOG_STRIP_ANSI` | `false` | Strip ANSI codes |\n| `SAS_LOG_WRITE` | `false` | Write logs to file |\n| `SAS_LOG_WRITE_PATH` | `./logs` | Log file directory |\n| `SAS_LOG_WRITE_MAX_FILE_SIZE` | `5242880` | Max log file size |\n| `SAS_LOG_WRITE_MAX_FILES` | `5` | Max number of log files |\n| `SAS_METRICS_ENABLED` | `false` | Enable Prometheus metrics |\n| `SAS_METRICS_PROM_HOST` | `127.0.0.1` | Prometheus host |\n| `SAS_METRICS_PROM_PORT` | `9100` | Prometheus port |\n| `SAS_METRICS_LOKI_HOST` | `127.0.0.1` | Loki host |\n| `SAS_METRICS_LOKI_PORT` | `3100` | Loki port |\n| `SAS_METRICS_INCLUDE_QUERYPARAMS` | `false` | Include query params in metric labels |\n| `SAS_SUBSTRATE_MULTI_CHAIN_URL` | — | JSON array for relay chain connection |\n\n### New in Polkadot REST API\n\n| Variable | Default | Purpose |\n|----------|---------|---------|\n| `SAS_EXPRESS_BLOCK_FETCH_CONCURRENCY` | `10` | Concurrent block fetches |\n| `SAS_EXPRESS_REQUEST_LIMIT` | `512000` | Max request body size (bytes) |\n| `SAS_SUBSTRATE_RECONNECT_INITIAL_DELAY_MS` | `100` | RPC reconnect initial delay |\n| `SAS_SUBSTRATE_RECONNECT_MAX_DELAY_MS` | `10000` | RPC reconnect max delay |\n| `SAS_SUBSTRATE_RECONNECT_REQUEST_TIMEOUT_MS` | `30000` | RPC request timeout |\n| `SAS_METRICS_PROMETHEUS_PREFIX` | `polkadot_rest_api` | Prometheus metric prefix |\n\n### Sidecar-only (not supported)\n\n| Variable | Purpose | Notes |\n|----------|---------|-------|\n| `SAS_SUBSTRATE_TYPES_BUNDLE` | Custom typesBundle | Not needed — subxt handles type resolution |\n| `SAS_SUBSTRATE_TYPES_CHAIN` | Custom typesChain | Not needed |\n| `SAS_SUBSTRATE_TYPES_SPEC` | Custom typesSpec | Not needed |\n| `SAS_SUBSTRATE_TYPES` | Custom types | Not needed |\n| `SAS_SUBSTRATE_CACHE_CAPACITY` | LRU cache size | Not implemented — uses different caching strategy |\n| `SAS_EXPRESS_INJECTED_CONTROLLERS` | Pallet-injected controllers | Not supported |\n| `SAS_EXPRESS_MAX_BODY` | Max body size | Replaced by `SAS_EXPRESS_REQUEST_LIMIT` |\n| `SAS_LOG_FILTER_RPC` | Filter API-WS RPC logging | Not implemented |\n\n---\n\n## Installation changes\n\n| | Sidecar | Polkadot REST API |\n|---|---------|-------------------|\n| **Runtime** | Node.js (v18+) | Rust binary (no runtime needed) |\n| **Install** | `npm install @substrate/api-sidecar` | `cargo install polkadot-rest-api` |\n| **Start** | `substrate-api-sidecar` | `polkadot-rest-api` |\n| **Docker** | `docker-compose up` | `docker-compose up` |\n\n---\n\n## Docker changes\n\nBoth projects provide a `Dockerfile` and `docker-compose.yml`. The compose stacks are similar (Polkadot node + API + Loki + Prometheus + Grafana + cAdvisor), but there are key differences.\n\n### Image details\n\n| | Sidecar | Polkadot REST API |\n|---|---------|-------------------|\n| **Base image (build)** | `node:18.12.1-alpine` | `rust:1.90.0-slim-bookworm` |\n| **Base image (runtime)** | `node:18.12.1-alpine` | `debian:bookworm-slim` |\n| **Runtime size** | Includes full Node.js runtime + `node_modules` | Static binary (~single executable) + `ca-certificates` |\n| **Docker Hub** | `parity/substrate-api-sidecar` | `parity/polkadot-rest-api` |\n| **Build command** | `yarn build:docker` | `docker build .` |\n| **Run user** | `node` | `nobody` |\n| **Default env vars** | `SAS_EXPRESS_PORT=8080`, `SAS_EXPRESS_BIND_HOST=0.0.0.0` | `SAS_EXPRESS_PORT=8080`, `SAS_EXPRESS_BIND_HOST=0.0.0.0`, `RUST_LOG=info` |\n\n### Docker run\n\n```bash\n# Sidecar\ndocker pull docker.io/parity/substrate-api-sidecar:latest\ndocker run --rm -it --read-only -p 8080:8080 substrate-api-sidecar\n\n# Polkadot REST API\ndocker pull docker.io/parity/polkadot-rest-api:latest\ndocker run --rm -it --read-only -p 8080:8080 polkadot-rest-api\n```\n\nBoth images support the `--read-only` flag and accept environment variables via `-e` or `--env-file`.\n\n### docker-compose.yml differences\n\nBoth compose files include the same services: `polkadot` node, API server, `loki`, `cadvisor`, `prometheus`, and `grafana`. Key differences:\n\n| | Sidecar | Polkadot REST API |\n|---|---------|-------------------|\n| **API service name** | `sidecar` | `rest-api` |\n| **Exposed ports** | `8080:8080`, `9100:9100` | `8080:8080` |\n| **Bind host config** | Set via env var `SAS_EXPRESS_BIND_HOST: "0.0.0.0"` | Set in Dockerfile default (`0.0.0.0`) |\n| **Prometheus metrics host** | Set via env var `SAS_METRICS_PROM_HOST: "0.0.0.0"` | Not set (uses default `127.0.0.1`) |\n\n### Migration steps for Docker users\n\n1. **Update image name**: Replace `parity/substrate-api-sidecar` with `parity/polkadot-rest-api`\n2. **Update service name** (if referenced): `sidecar` → `rest-api` (or your preferred name)\n3. **Remove `SAS_EXPRESS_BIND_HOST`** from environment if set to `0.0.0.0` — this is now the Dockerfile default\n4. **Update health checks**: Change `curl http://localhost:8080/blocks/head` to `curl http://localhost:8080/v1/blocks/head` (note the `/v1` prefix)\n5. **Remove unused env vars**: `SAS_SUBSTRATE_TYPES_*`, `SAS_SUBSTRATE_CACHE_CAPACITY`, `SAS_EXPRESS_INJECTED_CONTROLLERS` are not supported\n6. **Prometheus port**: Sidecar exposed port `9100` for Prometheus metrics. Polkadot REST API serves metrics on the main port at `/metrics` — update your Prometheus scrape config accordingly\n\n---\n\n## API Changes\n\n- `/v1/version` - Now users can query the currently running version of Polkadot REST API\n')};function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function Y(e,n){return function(e){if(Array.isArray(e))return e}(e)||function(e,n){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var r,a,o,i,s=[],c=!0,l=!1;try{if(o=(t=t.call(e)).next,0===n){if(Object(t)!==t)return;c=!1}else for(;!(c=(r=o.call(t)).done)&&(s.push(r.value),s.length!==n);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(l)throw a}}return s}}(e,n)||function(e,n){if(e){if("string"==typeof e)return K(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?K(e,n):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function K(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t3?(a=h===r)&&(c=o[(s=o[4])?5:(s=3,3)],o[4]=o[5]=e):o[0]<=m&&((a=t<2&&mr||r>h)&&(o[4]=t,o[5]=r,u.n=h,s=0))}if(a||t>1)return i;throw p=!0,r}return function(a,d,h){if(l>1)throw TypeError("Generator is already running");for(p&&1===d&&m(d,h),s=d,c=h;(n=s<2?e:c)||!p;){o||(s?s<3?(s>1&&(u.n=-1),m(s,c)):u.n=c:u.v=c);try{if(l=2,o){if(s||(a="next"),n=o[a]){if(!(n=n.call(o,c)))throw TypeError("iterator result is not an object");if(!n.done)return n;c=n.value,s<2&&(s=0)}else 1===s&&(n=o.return)&&n.call(o),s<2&&(c=TypeError("The iterator does not provide a '"+a+"' method"),s=1);o=e}else if((n=(p=u.n<0)?c:t.call(r,u))!==i)break}catch(n){o=e,s=1,c=n}finally{l=1}}return{value:n,done:p}}}(t,a,o),!0),l}var i={};function s(){}function c(){}function l(){}n=Object.getPrototypeOf;var d=[][r]?n(n([][r]())):(Q(n={},r,function(){return this}),n),p=l.prototype=s.prototype=Object.create(d);function u(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,Q(e,a,"GeneratorFunction")),e.prototype=Object.create(p),e}return c.prototype=l,Q(p,"constructor",l),Q(l,"constructor",c),c.displayName="GeneratorFunction",Q(l,a,"GeneratorFunction"),Q(p),Q(p,a,"Generator"),Q(p,r,function(){return this}),Q(p,"toString",function(){return"[object Generator]"}),(J=function(){return{w:o,m:u}})()}function Q(e,n,t,r){var a=Object.defineProperty;try{a({},"",{})}catch(e){a=0}Q=function(e,n,t,r){function o(n,t){Q(e,n,function(e){return this._invoke(n,t,e)})}n?a?a(e,n,{value:t,enumerable:!r,configurable:!r,writable:!r}):e[n]=t:(o("next",0),o("throw",1),o("return",2))},Q(e,n,t,r)}function Z(e,n,t,r,a,o,i){try{var s=e[o](i),c=s.value}catch(e){return void t(e)}s.done?n(c):Promise.resolve(c).then(r,a)}function ee(e){return function(){var n=this,t=arguments;return new Promise(function(r,a){var o=e.apply(n,t);function i(e){Z(o,r,a,i,s,"next",e)}function s(e){Z(o,r,a,i,s,"throw",e)}i(void 0)})}}function ne(e,n){for(var t=0;t1))try{var r=this.getSpecContentKey(e),a=W[r];if(!a)throw new Error("Specification content not found for: ".concat(e));t&&(t.innerHTML=a,this.setupCodeCopyButtons(t))}catch(n){console.error("Error loading specification content:",n),t&&(t.innerHTML='\n
    \n
    \n Error Loading Specification: Could not load the "'.concat(this.getSpecDisplayName(e),'" specification content.\n
    \n
    \n '))}}},{key:"getSpecContentKey",value:function(e){return{useRcBlock:"useRcBlock-spec"}[e]||e}},{key:"getSpecDisplayName",value:function(e){return{useRcBlock:"useRcBlock Specification"}[e]||e.replace(/-/g," ").replace(/\b\w/g,function(e){return e.toUpperCase()})}},{key:"loadGuideContent",value:function(e,n){var t=n.querySelector(".guide-content");if(!(t&&t.children.length>1))try{var r=W[e];if(!r)throw new Error("Guide content not found for: ".concat(e));t&&(t.innerHTML=r,this.setupCodeCopyButtons(t))}catch(n){console.error("Error loading guide content:",n),t&&(t.innerHTML='\n
    \n
    \n Error Loading Guide: Could not load the "'.concat(this.getGuideDisplayName(e),'" guide content.\n
    \n
    \n '))}}},{key:"setupCodeCopyButtons",value:function(e){e.querySelectorAll(".copy-button[data-copy]").forEach(function(e){e.addEventListener("click",function(n){n.preventDefault();var t=e.dataset.copy;navigator.clipboard&&navigator.clipboard.writeText(t).then(function(){var n=e.innerHTML;e.innerHTML='',setTimeout(function(){e.innerHTML=n},1e3)})})})}},{key:"getGuideDisplayName",value:function(e){return{"asset-hub-migration":"Asset Hub Migration","useRcBlock-spec":"useRcBlock Specification"}[e]||e.replace(/-/g," ").replace(/\b\w/g,function(e){return e.toUpperCase()})}},{key:"setupSearch",value:function(){var e,n=this,t=document.getElementById("search-input"),r=document.getElementById("search-clear"),a=document.getElementById("search-results");t&&this.searchHandler&&(t.addEventListener("input",function(t){var a=t.target.value.trim();r.style.display=a?"flex":"none",clearTimeout(e),e=setTimeout(function(){n.performSearch(a)},300)}),r.addEventListener("click",function(){t.value="",r.style.display="none",n.clearSearch()}),a.addEventListener("click",function(e){if(e.target.matches("[data-search-endpoint]")){e.preventDefault();var r=e.target.dataset.searchEndpoint;n.navigateToEndpoint(r),n.clearSearch(),t.blur()}else if(e.target.matches("[data-search-schema]")){e.preventDefault();var a=e.target.dataset.searchSchema;n.navigateToSchema(a),n.clearSearch(),t.blur()}}),t.addEventListener("keydown",function(e){"Escape"===e.key&&(n.clearSearch(),t.blur())}),document.addEventListener("click",function(e){e.target.closest(".search-container")||(a.style.display="none")}))}},{key:"setupServerSelection",value:function(){var e=this,n=document.getElementById("server-select");if(n){var t=this.parser.getServers();n.innerHTML="",t.forEach(function(e,t){var r=document.createElement("option");r.value=t,r.textContent=e.description||e.url,"http://localhost:8080"===e.url&&(r.selected=!0),n.appendChild(r)}),n.addEventListener("change",function(n){var r=parseInt(n.target.value),a=t[r];a&&(e.currentServer=a.url,e.updateExampleRequests())})}}},{key:"setupThemeToggle",value:function(){var e=document.getElementById("theme-toggle");if(e){var n=localStorage.getItem("theme")||"dark";document.documentElement.setAttribute("data-theme",n),e.addEventListener("click",function(){var e="dark"===document.documentElement.getAttribute("data-theme")?"light":"dark";document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e)})}}},{key:"setupMobileMenu",value:function(){var e=document.getElementById("menu-toggle"),n=document.getElementById("sidebar");e&&n&&(e.addEventListener("click",function(){n.classList.toggle("mobile-open"),e.classList.toggle("active")}),document.addEventListener("click",function(t){n.contains(t.target)||e.contains(t.target)||(n.classList.remove("mobile-open"),e.classList.remove("active"))}))}},{key:"setupCopyToClipboard",value:function(){var e=this;document.addEventListener("click",function(){var n=ee(J().m(function n(t){var r,a,o;return J().w(function(n){for(;;)switch(n.p=n.n){case 0:if(!t.target.matches(".copy-button")&&!t.target.closest(".copy-button")){n.n=4;break}if(t.preventDefault(),r=t.target.matches(".copy-button")?t.target:t.target.closest(".copy-button"),a=r.dataset.copy){n.n=1;break}return n.a(2);case 1:return n.p=1,n.n=2,navigator.clipboard.writeText(a);case 2:e.showCopyFeedback(r),n.n=4;break;case 3:n.p=3,o=n.v,console.error("Failed to copy text:",o),e.fallbackCopy(a,r);case 4:return n.a(2)}},n,null,[[1,3]])}));return function(e){return n.apply(this,arguments)}}())}},{key:"setupScrollSpy",value:function(){var e=new IntersectionObserver(function(e){e.forEach(function(e){var n=e.target.id,t=document.querySelector('[href="#'.concat(n,'"]'));t&&e.isIntersecting&&(document.querySelectorAll(".nav-link.active").forEach(function(e){e.classList.remove("active")}),t.classList.add("active"))})},{root:null,rootMargin:"-10% 0px -80% 0px",threshold:0});document.querySelectorAll(".content-section").forEach(function(n){e.observe(n)})}},{key:"setupCollapsibleSections",value:function(){document.addEventListener("click",function(e){if(e.target.matches(".section-toggle")||e.target.closest(".section-toggle")){e.preventDefault(),e.stopPropagation();var n=e.target.matches(".section-toggle")?e.target:e.target.closest(".section-toggle"),t=n.dataset.target,r=document.getElementById(t);r&&(r.classList.toggle("collapsed"),n.classList.toggle("collapsed"))}if(e.target.matches(".nav-section-header")||e.target.closest(".nav-section-header")){var a=(e.target.matches(".nav-section-header")?e.target:e.target.closest(".nav-section-header")).querySelector(".section-toggle");if(a){var o=a.dataset.target,i=document.getElementById(o);i&&(i.classList.toggle("collapsed"),a.classList.toggle("collapsed"))}}})}},{key:"setupCurlGenerator",value:function(){var e=this;document.addEventListener("click",function(n){if(n.target.matches(".generate-curl-btn")||n.target.closest(".generate-curl-btn")){n.preventDefault();var t=(n.target.matches(".generate-curl-btn")?n.target:n.target.closest(".generate-curl-btn")).dataset.endpointId;e.generateCurlCommand(t)}}),document.addEventListener("click",function(){var n=ee(J().m(function n(t){var r,a,o;return J().w(function(n){for(;;)switch(n.p=n.n){case 0:if(!t.target.id||!t.target.id.startsWith("copy-curl-")){n.n=4;break}if(t.preventDefault(),r=t.target.id.replace("copy-curl-",""),!(a=document.getElementById("curl-command-".concat(r)))||!a.textContent){n.n=4;break}return n.p=1,n.n=2,navigator.clipboard.writeText(a.textContent);case 2:e.showCopyFeedback(t.target),n.n=4;break;case 3:n.p=3,o=n.v,console.error("Failed to copy:",o);case 4:return n.a(2)}},n,null,[[1,3]])}));return function(e){return n.apply(this,arguments)}}())}},{key:"setupSendRequest",value:function(){var e=this;document.addEventListener("click",function(){var n=ee(J().m(function n(t){var r,a,o,i,s,c,l,d,p,u,m,h,g,f,v,y,b;return J().w(function(n){for(;;)switch(n.p=n.n){case 0:if(!t.target.matches(".send-request-btn")&&!t.target.closest(".send-request-btn")){n.n=11;break}if(t.preventDefault(),r=t.target.matches(".send-request-btn")?t.target:t.target.closest(".send-request-btn"),a=r.dataset.endpointId,o=e.parser.getEndpoint(a)){n.n=1;break}return n.a(2);case 1:if(i=document.querySelectorAll('[data-endpoint-id="'.concat(a,'"] .param-input')),s=!1,i.forEach(function(e){var n=e.hasAttribute("required"),t=e.value.trim();n&&!t?(s=!0,e.classList.add("error")):e.classList.remove("error")}),!s){n.n=2;break}return e.showParameterError(a,"Please fill in all required parameters"),n.a(2);case 2:return c=e.buildApiExplorerRequestConfig(o,a),r.disabled=!0,r.textContent="Sending...",l=document.getElementById("response-output-".concat(a)),d=document.getElementById("response-status-".concat(a)),p=document.getElementById("response-time-".concat(a)),u=document.getElementById("response-body-".concat(a)),n.p=3,m=Date.now(),n.n=4,fetch(c.url,{method:c.options.method,headers:c.options.headers,body:c.options.body});case 4:if(h=n.v,g=Date.now()-m,!(h.headers.get("content-type")||"").includes("application/json")){n.n=6;break}return y=JSON,n.n=5,h.json();case 5:f=y.stringify.call(y,n.v,null,2),n.n=8;break;case 6:return n.n=7,h.text();case 7:f=n.v;case 8:l&&(l.style.display="block"),d&&(d.textContent="".concat(h.status," ").concat(h.statusText),d.className="response-status ".concat(h.ok?"status-success":"status-error")),p&&(p.textContent="".concat(g,"ms")),u&&(u.textContent=f),(v=document.getElementById("copy-response-".concat(a)))&&(v.onclick=ee(J().m(function n(){var t;return J().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,n.n=1,navigator.clipboard.writeText(f);case 1:e.showCopyFeedback(v),n.n=3;break;case 2:n.p=2,t=n.v,console.error("Copy failed:",t);case 3:return n.a(2)}},n,null,[[0,2]])}))),n.n=10;break;case 9:n.p=9,b=n.v,l&&(l.style.display="block"),d&&(d.textContent="Error",d.className="response-status status-error"),p&&(p.textContent=""),u&&(u.textContent=b.message);case 10:return n.p=10,r.disabled=!1,r.textContent="Send Request",n.f(10);case 11:return n.a(2)}},n,null,[[3,9,10,11]])}));return function(e){return n.apply(this,arguments)}}())}},{key:"setupApiExplorerListeners",value:function(){var e=this;document.addEventListener("input",function(n){if(n.target.matches(".param-input")||n.target.matches(".json-input")){var t=n.target.dataset.endpoint;t&&e.updateApiExplorerPreview(t)}})}},{key:"updateApiExplorerPreview",value:function(e){var n=this.parser.getEndpoint(e);if(n){var t=this.buildApiExplorerRequestConfig(n,e),r=document.getElementById("curl-preview-".concat(e));r&&(r.textContent=this.generateCurl(t))}}},{key:"buildApiExplorerRequestConfig",value:function(e,n){var t=this.currentServer+e.path,r={method:e.method,headers:{"Content-Type":"application/json"}},a=new URLSearchParams,o={},i=document.querySelector('.parameter-inputs[data-endpoint-id="'.concat(n,'"]'));(i?i.querySelectorAll(".param-input"):[]).forEach(function(e){var n=e.dataset.paramName,t=e.value.trim(),i=e.dataset.paramLocation;if(t)switch(i){case"path":o[n]=t;break;case"query":a.append(n,t);break;case"header":r.headers[n]=t}}),Object.entries(o).forEach(function(e){var n=Y(e,2),r=n[0],a=n[1];t=t.replace("{".concat(r,"}"),encodeURIComponent(a))});var s=a.toString();s&&(t+=(t.includes("?")?"&":"?")+s);var c=document.getElementById("request-body-".concat(n));if(c&&c.value.trim())try{r.body=JSON.stringify(JSON.parse(c.value))}catch(e){r.body=c.value}return{url:t,options:r}}},{key:"generateCurl",value:function(e){var n="curl -X ".concat(e.options.method,' "').concat(e.url,'"');return Object.entries(e.options.headers||{}).forEach(function(e){var t=Y(e,2),r=t[0],a=t[1];n+=' \\\n -H "'.concat(r,": ").concat(a,'"')}),e.options.body&&(n+=" \\\n -d '".concat(e.options.body,"'")),n}},{key:"generateCurlCommand",value:function(e){var n=this.parser.getEndpoint(e);if(n){var t=document.querySelectorAll('[data-endpoint-id="'.concat(e,'"] .param-input')),r={},a=!1;if(t.forEach(function(e){var n=e.dataset.paramName,t=e.dataset.paramLocation,o=e.value.trim();e.hasAttribute("required")&&!o?(a=!0,e.classList.add("error")):e.classList.remove("error"),o&&(r[t]||(r[t]={}),r[t][n]=o)}),a)this.showParameterError(e,"Please fill in all required parameters");else{var o=this.currentServer+n.path,i=n.method.toUpperCase();if(r.path&&Object.entries(r.path).forEach(function(e){var n=Y(e,2),t=n[0],r=n[1];o=o.replace("{".concat(t,"}"),encodeURIComponent(r))}),r.query&&Object.keys(r.query).length>0){var s=Object.entries(r.query).map(function(e){var n=Y(e,2),t=n[0],r=n[1];return"".concat(encodeURIComponent(t),"=").concat(encodeURIComponent(r))}).join("&");o+="?".concat(s)}var c="curl -X ".concat(i);"GET"!==i&&(c+=' -H "Content-Type: application/json"'),!n.requestBody||"POST"!==i&&"PUT"!==i&&"PATCH"!==i||(c+=' \\\n -d \'{"example": "data"}\' \\'),c+=' \\\n "'.concat(o,'"'),this.displayGeneratedCurl(e,c)}}}},{key:"displayGeneratedCurl",value:function(e,n){var t=document.getElementById("curl-output-".concat(e)),r=document.getElementById("curl-command-".concat(e)),a=document.getElementById("copy-curl-".concat(e));t&&r&&(r.textContent=n,t.style.display="block",a&&(a.dataset.copy=n),t.scrollIntoView({behavior:"smooth",block:"nearest"}))}},{key:"showParameterError",value:function(e,n){var t=document.querySelector('[data-endpoint-id="'.concat(e,'"] .param-error'));t&&t.remove();var r=document.querySelector('[data-endpoint-id="'.concat(e,'"] .generate-curl-section'));if(r){var a=document.createElement("div");a.className="param-error",a.textContent=n,r.insertBefore(a,r.firstChild),setTimeout(function(){a.parentNode&&a.remove()},5e3)}}},{key:"render",value:function(){this.components.renderNavigation(),this.updateApiInfo(),setTimeout(function(){var e=document.getElementById("endpoints-nav"),n=document.querySelector('[data-target="endpoints-nav"]');e&&n&&(e.classList.remove("collapsed"),n.classList.remove("collapsed"))},100)}},{key:"updateApiInfo",value:function(){var e=this.parser.getApiInfo();document.querySelectorAll("#api-version, #version-display").forEach(function(n){n.textContent="v".concat(e.version)}),document.title="".concat(e.title," Documentation")}},{key:"navigateToEndpoint",value:function(e){console.log("Navigating to endpoint:",e);var n=this.parser.getEndpoint(e);if(n)try{var t=this.components.renderEndpoint(n,this.currentServer);this.showContent(t),this.updateBreadcrumb([{name:"API",href:"#overview"},{name:n.tags[0]||"Endpoints",href:"#"},{name:"".concat(n.method," ").concat(n.path),href:"#endpoint-".concat(e)}]),window.scrollTo(0,0),console.log("Successfully navigated to endpoint:",e)}catch(e){console.error("Error navigating to endpoint:",e)}else console.error("Endpoint not found:",e)}},{key:"navigateToSchema",value:function(e){var n=this.parser.getSchema(e);if(n){var t=this.components.renderSchemaPage(n);this.showContent(t),this.updateBreadcrumb([{name:"API",href:"#overview"},{name:"Schemas",href:"#"},{name:e,href:"#schema-".concat(e)}]),window.scrollTo(0,0)}}},{key:"showContent",value:function(e){var n=document.getElementById("dynamic-content"),t=document.getElementById("overview"),r=document.getElementById("getting-started");n&&t&&(t.style.display="none",r&&(r.style.display="none"),n.innerHTML=e,document.querySelectorAll('[id^="guide-"], [id^="spec-"]').forEach(function(e){e.style.display="none"}))}},{key:"showOverview",value:function(){var e=document.getElementById("dynamic-content"),n=document.getElementById("overview"),t=document.getElementById("getting-started");e&&n&&(n.style.display="block",t&&(t.style.display="none"),e.innerHTML="",document.querySelectorAll('[id^="guide-"], [id^="spec-"]').forEach(function(e){e.style.display="none"})),window.scrollTo(0,0),this.hideBreadcrumb()}},{key:"showGettingStarted",value:function(){var e=document.getElementById("dynamic-content"),n=document.getElementById("overview"),t=document.getElementById("getting-started");e&&t&&n&&(n.style.display="none",t.style.display="block",e.innerHTML="",document.querySelectorAll('[id^="guide-"], [id^="spec-"]').forEach(function(e){e.style.display="none"})),window.scrollTo(0,0),this.hideBreadcrumb()}},{key:"performSearch",value:function(e){var n=this.searchHandler.search(e);this.searchHandler.renderResults(n)}},{key:"clearSearch",value:function(){var e=document.getElementById("search-input"),n=document.getElementById("search-clear"),t=document.getElementById("search-results");e&&(e.value=""),n&&(n.style.display="none"),t&&(t.style.display="none")}},{key:"updateBreadcrumb",value:function(e){var n=document.getElementById("breadcrumb"),t=n.querySelector(".breadcrumb-list");t&&(t.innerHTML=e.map(function(n,t){return'\n \n ")}).join(""),n.style.display="block")}},{key:"hideBreadcrumb",value:function(){var e=document.getElementById("breadcrumb");e&&(e.style.display="none")}},{key:"updateExampleRequests",value:function(){var e=this;console.log("Server changed to:",this.currentServer),document.querySelectorAll(".request-url").forEach(function(n){var t=n.dataset.endpoint,r=e.parser.getEndpoint(t);r&&(n.value=e.currentServer+r.path)}),document.querySelectorAll('[id^="curl-preview-"]').forEach(function(e){e.textContent="# Enter parameters to generate request"}),document.querySelectorAll('[id^="curl-command-"]').forEach(function(e){e.textContent=""})}},{key:"showCopyFeedback",value:function(e){var n=e.innerHTML;e.innerHTML="✓",e.classList.add("copied"),setTimeout(function(){e.innerHTML=n,e.classList.remove("copied")},2e3)}},{key:"copyToClipboard",value:(t=ee(J().m(function e(n){var t;return J().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,navigator.clipboard.writeText(n);case 1:e.n=3;break;case 2:e.p=2,t=e.v,console.error("Failed to copy text:",t),this.fallbackCopy(n);case 3:return e.a(2)}},e,this,[[0,2]])})),function(e){return t.apply(this,arguments)})},{key:"fallbackCopy",value:function(e,n){var t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();try{document.execCommand("copy"),this.showCopyFeedback(n)}catch(e){console.error("Fallback copy failed:",e)}document.body.removeChild(t)}},{key:"showLoading",value:function(){var e=document.getElementById("loading-screen"),n=document.getElementById("app");e&&(e.style.display="flex"),n&&(n.style.display="none")}},{key:"hideLoading",value:function(){var e=document.getElementById("loading-screen"),n=document.getElementById("app");e&&(e.style.display="none"),n&&(n.style.display="block")}},{key:"showError",value:function(e){var n=document.getElementById("loading-screen");n&&(n.innerHTML='\n
    \n
    ⚠️
    \n

    '.concat(e,'

    \n \n
    \n '))}}],n&&ne(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,n,t,r}();document.addEventListener("DOMContentLoaded",function(){var e=new re;window.docAppInstance=e,e.init()}),window.addEventListener("hashchange",function(){var e=window.location.hash.slice(1);if(e.startsWith("endpoint-")){var n=e.replace("endpoint-",""),t=window.docAppInstance;t&&t.navigateToEndpoint(n)}else if(e.startsWith("schema-")){var r=e.replace("schema-",""),a=window.docAppInstance;a&&a.navigateToSchema(r)}else if("getting-started"===e){var o=window.docAppInstance;if(o){o.showGettingStarted(),document.querySelectorAll("[data-page]").forEach(function(e){e.classList.remove("active")});var i=document.querySelector('[data-page="getting-started"]');i&&i.classList.add("active")}}else if(e.startsWith("guide-")){var s=e.replace("guide-",""),c=window.docAppInstance;if(c){c.showGuide(s),document.querySelectorAll("[data-guide]").forEach(function(e){e.classList.remove("active")});var l=document.querySelector('[data-guide="'.concat(s,'"]'));l&&l.classList.add("active")}}else if(e.startsWith("spec-")){var d=e.replace("spec-",""),p=window.docAppInstance;if(p){p.showSpecification(d),document.querySelectorAll("[data-spec]").forEach(function(e){e.classList.remove("active")});var u=document.querySelector('[data-spec="'.concat(d,'"]'));u&&u.classList.add("active")}}else if(!e||"overview"===e){var m=window.docAppInstance;if(m){m.showOverview(),document.querySelectorAll("[data-page]").forEach(function(e){e.classList.remove("active")});var h=document.querySelector('[data-page="overview"]');h&&h.classList.add("active")}}}),window.addEventListener("load",function(){var e=window.location.hash.slice(1);e&&"overview"!==e&&setTimeout(function(){console.log("Triggering initial navigation for hash:",e),window.dispatchEvent(new HashChangeEvent("hashchange"))},1e3)}),window.DocApp=re})(); \ No newline at end of file diff --git a/docs/dist/index.html b/docs/dist/index.html index 303d07bd..01b6fd76 100644 --- a/docs/dist/index.html +++ b/docs/dist/index.html @@ -1,4 +1,4 @@ -Polkadot REST API Documentation

    Loading API Documentation...