{
  "openapi": "3.1.0",
  "info": {
    "title": "EtherTools Public Learning Content API",
    "version": "1.0.0",
    "description": "Anonymous read-only access to the same public lesson content as the website. No registration, credentials, remote tool execution or RPC calls."
  },
  "servers": [
    {
      "url": "https://ethertools.xyz"
    }
  ],
  "security": [],
  "paths": {
    "/api/v1/catalog.json": {
      "get": {
        "operationId": "getCatalog",
        "summary": "List lessons, tracks and browser tools",
        "responses": {
          "200": {
            "description": "Public content catalog",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/lessons/{slug}.json": {
      "get": {
        "operationId": "getLesson",
        "summary": "Read one complete published lesson",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "blockchain",
                "ethereum",
                "digital-ledger",
                "computers-agree",
                "block-anatomy",
                "block-links",
                "transaction-intro",
                "decentralization",
                "who-can-use-ethereum",
                "who-owns-ethereum",
                "ethereum-and-internet",
                "ethereum-and-bitcoin",
                "blockchain-proofs",
                "blockchain-limits",
                "public-not-anonymous",
                "network-fee-intro",
                "account-intro",
                "block-explorer-intro",
                "ecosystem-tour",
                "blockchain-knowledge-check",
                "ether-and-units",
                "eth-versus-tokens",
                "billion-and-quintillion",
                "eth-to-wei-by-hand",
                "wei-to-eth-by-hand",
                "whole-number-amounts",
                "floating-point-amounts",
                "large-integer-reading",
                "token-decimals",
                "display-and-raw-units",
                "exact-amount-arithmetic",
                "rounding-and-truncation",
                "converter-versus-price",
                "token-balance-meaning",
                "native-versus-token-transfer",
                "total-and-circulating-supply",
                "burning-explained",
                "minting-explained",
                "dust-balances",
                "unit-conversion-practice",
                "wallets",
                "wallet-stored-data",
                "recovery-phrase",
                "public-and-private-keys",
                "address-not-username",
                "software-and-hardware-wallets",
                "watch-only-wallets",
                "one-phrase-many-accounts",
                "derivation-paths",
                "contract-wallets",
                "multisignature-wallets",
                "wallet-connection-permissions",
                "disconnecting-and-revoking",
                "wallet-networks",
                "balances-across-networks",
                "wallet-confirmation-screen",
                "receive-screen",
                "copy-addresses",
                "backup-recovery-basics",
                "wallet-safety-check",
                "security",
                "fake-support",
                "phrase-scam",
                "address-poisoning",
                "clipboard-attacks",
                "read-domain",
                "token-approval-basics",
                "unlimited-allowances",
                "malicious-signatures",
                "airdrop-bait",
                "testnet-purpose",
                "test-eth",
                "faucet-warnings",
                "verify-address-channels",
                "irreversible-transactions",
                "explorer-label-limits",
                "hardware-review",
                "read-only-practice",
                "personal-transaction-checklist",
                "safety-scenario-challenge",
                "transactions",
                "payment-instruction",
                "transaction-hash",
                "transaction-nonce",
                "transaction-status",
                "mempool",
                "transaction-inclusion",
                "pending-delays",
                "transaction-failures",
                "transaction-receipt",
                "gas-used-and-limit",
                "sender-and-recipient",
                "transaction-value-and-fee",
                "read-transfer-receipt",
                "after-pressing-send",
                "replacement-transactions",
                "canceling-transactions",
                "chain-reorganizations",
                "transaction-journey-illustrated",
                "transaction-basics-check",
                "smart-contracts",
                "counter-contract",
                "function-arguments",
                "reads-and-writes",
                "contract-state",
                "contract-callers",
                "contract-address",
                "contract-deployment",
                "contract-bytecode",
                "verified-source",
                "abi-description",
                "contract-limits",
                "oracle-intro",
                "permission-checks",
                "administrator-keys",
                "contract-upgrades",
                "contract-bug-costs",
                "vending-machine-analogy",
                "pretend-contract-call",
                "contract-basics-check",
                "tokens",
                "erc20-balance-records",
                "transfer-and-transferfrom",
                "read-allowance",
                "allowance-changes",
                "erc20-decimals-convention",
                "nft-uniqueness",
                "erc721-ownership",
                "erc1155-types",
                "metadata-and-ownership",
                "nft-image-storage",
                "onchain-offchain-metadata",
                "token-standard-guarantees",
                "token-name-identity",
                "wrapped-eth",
                "stablecoin-mechanisms",
                "rebasing-tokens",
                "fee-on-transfer",
                "token-events-behavior",
                "token-interface-practice",
                "gas",
                "gas-work",
                "simple-transfer-gas",
                "transaction-and-block-gas",
                "eip1559-simple",
                "base-fee",
                "priority-fee",
                "max-fee-cap",
                "effective-gas-price",
                "unused-gas",
                "out-of-gas",
                "revert-gas-cost",
                "gas-estimate-limits",
                "warm-cold-access",
                "storage-gas",
                "gas-refunds",
                "execution-blob-fees",
                "l2-fee-components",
                "manual-fee-budget",
                "gas-practice",
                "nodes",
                "proof-of-stake",
                "execution-consensus-clients",
                "nodes-vs-validators",
                "full-node-verification",
                "archive-node",
                "p2p-networking",
                "slots",
                "epochs",
                "block-proposer",
                "attestations",
                "fork-choice",
                "checkpoints-finality",
                "validator-rewards-penalties",
                "slashing",
                "client-diversity",
                "light-client",
                "rpc-provider-trust",
                "rpc-reads-writes",
                "network-architecture-check",
                "layer-2",
                "layer1-layer2",
                "rollup-batches",
                "optimistic-rollups",
                "validity-rollups",
                "fault-proof-windows",
                "validity-proof-verification",
                "sequencers",
                "sequencer-exit-paths",
                "settlement-execution",
                "data-availability",
                "blob-data",
                "bridge-risk",
                "canonical-third-party-bridges",
                "deposits-withdrawals",
                "withdrawal-timing",
                "sidechains",
                "network-chain-ids",
                "scaling-trust-assumptions",
                "layer2-practice",
                "defi",
                "ethereum-payments",
                "everyday-stablecoins",
                "decentralized-exchanges",
                "liquidity-pools",
                "price-impact-slippage",
                "lending-collateral",
                "liquidation",
                "interest-rate-models",
                "financial-oracles",
                "dao-intro",
                "governance-proposals",
                "voting-power-ownership",
                "decentralized-identity",
                "ens-names",
                "public-goods-funding",
                "collectibles-beyond-speculation",
                "account-abstraction-users",
                "composability-risk",
                "application-risk-check",
                "solidity",
                "solidity-file",
                "pragma-versions",
                "constructors",
                "bool-integer-types",
                "signed-unsigned",
                "address-payable",
                "fixed-dynamic-bytes",
                "strings-utf8",
                "state-local-variables",
                "visibility",
                "view-pure",
                "parameters-returns",
                "require-revert-assert",
                "modifiers",
                "solidity-events",
                "custom-errors-solidity",
                "interfaces-inheritance",
                "receive-fallback",
                "read-small-contract",
                "abi",
                "calldata",
                "canonical-signatures",
                "function-selectors",
                "abi-uint256",
                "abi-signed-integers",
                "abi-address-word",
                "abi-boolean-word",
                "abi-fixed-bytes",
                "abi-static-tuples",
                "abi-fixed-arrays",
                "abi-return-data",
                "abi-multiple-returns",
                "abi-overloads",
                "json-abi",
                "abi-not-self-describing",
                "selector-collisions",
                "abi-vs-packed",
                "erc20-calldata-walkthrough",
                "static-abi-practice",
                "abi-head-tail",
                "abi-relative-offsets",
                "abi-one-string",
                "abi-utf8-length",
                "abi-dynamic-padding",
                "abi-two-dynamic",
                "abi-uint-array",
                "abi-string-array",
                "abi-fixed-dynamic-array",
                "abi-static-tuple-array",
                "abi-tuple-string",
                "abi-nested-offset-bases",
                "abi-nested-dynamic-array",
                "abi-empty-dynamic",
                "abi-malformed-offsets",
                "abi-decoder-bounds",
                "abi-coder-versions",
                "abi-language-consistency",
                "abi-build-dynamic-trace",
                "abi-nested-challenges",
                "events",
                "reverts",
                "event-signature-hash",
                "indexed-event-arguments",
                "decode-transfer-log",
                "decode-approval-log",
                "anonymous-events",
                "indexed-string-topics",
                "receipt-log-context",
                "reverted-logs",
                "nested-event-order",
                "decode-error-string",
                "decode-panic",
                "arithmetic-panic-codes",
                "decode-custom-error",
                "empty-revert-data",
                "bubbled-errors",
                "spoofed-revert-bytes",
                "error-call-frame",
                "receipt-error-challenges",
                "storage",
                "storage-word",
                "storage-packing",
                "storage-byte-offsets",
                "struct-storage",
                "fixed-array-storage",
                "dynamic-array-storage",
                "mapping-slots",
                "nested-mapping-storage",
                "mapping-struct-storage",
                "short-storage-bytes",
                "long-storage-bytes",
                "inheritance-storage-order",
                "proxy-storage-layout",
                "namespaced-storage",
                "memory-expansion",
                "free-memory-pointer",
                "calldata-memory-copies",
                "transient-storage",
                "storage-challenges",
                "evm",
                "bytecode-source",
                "program-counter",
                "evm-stack",
                "push-dup-swap",
                "evm-modular-arithmetic",
                "evm-signed-arithmetic",
                "evm-bitwise",
                "evm-shifts-bytes",
                "evm-memory-ops",
                "evm-storage-ops",
                "evm-calldata-ops",
                "evm-return-data",
                "evm-jumps",
                "evm-halting",
                "evm-call",
                "evm-staticcall",
                "evm-delegatecall",
                "evm-log-opcodes",
                "evm-trace-challenge",
                "transaction-call-context",
                "sender-origin",
                "nested-msg-value",
                "create-contract",
                "create2-addresses",
                "init-runtime-code",
                "value-call-failures",
                "call-depth-limits",
                "gas-forwarding",
                "return-data-griefing",
                "evm-precompiles",
                "selfdestruct-changes",
                "code-deployment-limits",
                "frame-reentrancy",
                "rollback-boundaries",
                "static-context",
                "delegatecall-trace",
                "failed-token-trace",
                "proxy-fallback-trace",
                "low-level-challenges",
                "hashing",
                "signatures",
                "bytes-hex",
                "keccak-sha3",
                "preimages-collisions",
                "domain-separation",
                "elliptic-curves",
                "secp256k1-keys",
                "address-derivation",
                "signature-rsv",
                "recover-signer",
                "personal-sign-prefix",
                "eip712-domain",
                "eip712-structs",
                "signature-nonces",
                "signature-deadlines",
                "erc1271-signatures",
                "signature-malleability",
                "commit-reveal",
                "signature-practice",
                "merkle-trees",
                "merkle-leaf-hash",
                "merkle-pair-hash",
                "merkle-pair-order",
                "merkle-odd-leaves",
                "build-merkle-proof",
                "verify-merkle-proof",
                "proof-size-depth",
                "trusted-merkle-root",
                "merkle-multiproofs",
                "merkle-allowlists",
                "merkle-leaf-ambiguity",
                "double-hashed-leaves",
                "tries-versus-merkle",
                "state-transaction-roots",
                "receipt-roots",
                "account-proofs",
                "storage-proofs",
                "verkle-direction",
                "merkle-challenges",
                "checks-effects-interactions",
                "reentrancy-counterexample",
                "cross-function-reentrancy",
                "read-only-reentrancy",
                "access-control-errors",
                "initializer-security",
                "unchecked-arithmetic",
                "financial-rounding",
                "token-return-differences",
                "approval-races",
                "external-call-assumptions",
                "loop-denial-service",
                "storage-growth-security",
                "timestamp-security",
                "randomness-security",
                "oracle-manipulation",
                "flash-loan-mechanism",
                "slippage-sandwich",
                "frontend-contract-security",
                "security-review-practice",
                "delegate-storage-collisions",
                "proxy-authority-risks",
                "upgrade-authorization",
                "cross-chain-signature-replay",
                "typed-domain-mistakes",
                "contract-signature-assumptions",
                "calldata-type-confusion",
                "packed-encoding-collisions",
                "proof-leaf-security",
                "callback-boundaries",
                "token-hook-security",
                "crosschain-authentication",
                "bridge-replay",
                "accounting-invariants",
                "donation-inflation",
                "liquidation-boundaries",
                "decimal-precision-security",
                "emergency-governance",
                "write-threat-model",
                "advanced-security-scenarios",
                "local-solidity-project",
                "compiler-errors",
                "counter-unit-tests",
                "test-authorization",
                "test-revert-payload",
                "test-event-emission",
                "test-token-decimals",
                "test-storage-properties",
                "fuzz-testing",
                "invariant-testing",
                "abi-roundtrip-properties",
                "fork-testing-limits",
                "mocks-dependencies",
                "differential-testing",
                "gas-snapshots",
                "compiler-storage-output",
                "source-verification",
                "document-assumptions",
                "review-code-change",
                "local-testing-capstone",
                "execution-payloads",
                "block-header-fields",
                "typed-transactions",
                "eip155-replay",
                "eip1559-fields",
                "access-list-transactions",
                "blob-transactions",
                "blob-commitments",
                "state-transition-function",
                "account-state-fields",
                "account-transaction-nonce",
                "fee-recipient",
                "withdrawal-processing",
                "validator-lifecycle",
                "weak-subjectivity",
                "finality-recovery",
                "mev-incentives",
                "proposer-builder-separation",
                "protocol-upgrades",
                "protocol-reading-challenge",
                "capstone-transfer-explainer",
                "capstone-unit-converter",
                "capstone-checksum",
                "capstone-selector",
                "capstone-transfer-bytes",
                "capstone-dynamic-call",
                "capstone-transfer-receipt",
                "capstone-execution-fee",
                "capstone-storage-visualizer",
                "capstone-mapping-slot",
                "capstone-merkle-proof",
                "capstone-revert-decoder",
                "capstone-stack-trace",
                "capstone-signature-review",
                "capstone-approval-threat-model",
                "capstone-rollup-explainer",
                "capstone-upgrade-review",
                "capstone-safe-sandbox",
                "capstone-publish-lesson",
                "capstone-portfolio"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Published lesson",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lesson"
                }
              }
            }
          },
          "404": {
            "description": "No published lesson has that slug. The static host returns its standard 404 page."
          }
        }
      }
    },
    "/api/v1/status.json": {
      "get": {
        "operationId": "getReleaseStatus",
        "summary": "Read static release availability and counts",
        "responses": {
          "200": {
            "description": "Static release information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "status",
                    "mode",
                    "lessonCount"
                  ],
                  "properties": {
                    "status": {
                      "const": "ok"
                    },
                    "mode": {
                      "const": "static-release"
                    },
                    "lessonCount": {
                      "type": "integer"
                    },
                    "trackCount": {
                      "type": "integer"
                    },
                    "toolCount": {
                      "type": "integer"
                    },
                    "description": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Catalog": {
        "type": "object",
        "required": [
          "version",
          "access",
          "lessonCount",
          "lessons",
          "tools",
          "tracks"
        ],
        "properties": {
          "version": {
            "type": "string"
          },
          "access": {
            "const": "public-read-only"
          },
          "lessonCount": {
            "type": "integer"
          },
          "toolExecution": {
            "type": "string"
          },
          "lessons": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "slug",
                "title",
                "url",
                "json",
                "markdown"
              ],
              "properties": {
                "slug": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "summary": {
                  "type": "string"
                },
                "level": {
                  "enum": [
                    "beginner",
                    "intermediate",
                    "advanced"
                  ]
                },
                "minutes": {
                  "type": "integer"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "json": {
                  "type": "string",
                  "format": "uri"
                },
                "markdown": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "tools": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "tracks": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      },
      "Lesson": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "level",
          "summary",
          "minutes",
          "url",
          "source",
          "contentMarkdown"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "level": {
            "enum": [
              "beginner",
              "intermediate",
              "advanced"
            ]
          },
          "summary": {
            "type": "string"
          },
          "minutes": {
            "type": "integer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "contentMarkdown": {
            "type": "string"
          },
          "examples": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "quiz": {
            "type": "object"
          }
        }
      }
    }
  }
}
