{"openapi":"3.0.3","info":{"title":"Stampchain - OpenAPI 3.0","description":"Stampchain API UI","version":"2.3.0","license":{"name":"GNU Affero General Public License v3.0","url":"https://www.gnu.org/licenses/agpl-3.0.html"},"contact":{"name":"Stampchain Support","url":"https://stampchain.io","email":"api@stampchain.io"}},"paths":{"/api/v2/health":{"get":{"operationId":"getHealthStatus","tags":["System"],"summary":"Health check endpoint","description":"Checks if the API service is running and responding correctly.\nValidates the status of core services including the API, indexer, and mempool connectivity.\nAlso provides block synchronization status between the indexer and network.\nIncludes current versions of system components (Bitcoin Core, Counterparty, Stamps Indexer) when available.\n","responses":{"200":{"description":"Detailed health status of the system and its services","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["OK","ERROR"],"description":"Overall system health status"},"services":{"type":"object","properties":{"api":{"type":"boolean","description":"API service connectivity"},"indexer":{"type":"boolean","description":"Indexer service connectivity"},"mempool":{"type":"boolean","description":"Mempool API connectivity"},"database":{"type":"boolean","description":"Database connectivity"},"xcp":{"type":"boolean","description":"Counterparty node connectivity"},"blockSync":{"type":"object","description":"Block synchronization information","properties":{"indexed":{"type":"integer","description":"Last indexed block height"},"network":{"type":"integer","description":"Current network block height"},"isSynced":{"type":"boolean","description":"Whether the indexer is in sync with the network (allowing 1 block lag)"}}},"stats":{"type":"object","description":"System-wide statistics","properties":{"src20Deployments":{"type":"integer","description":"Total number of SRC-20 tokens deployed"},"totalStamps":{"type":"integer","description":"Total number of stamps in the system"}}},"nodeVersions":{"type":"array","description":"Current versions of system components (bitcoin_core, counterparty, stamps_indexer)","items":{"type":"object","required":["component_name","version_string","detected_at"],"properties":{"component_name":{"type":"string","description":"Component identifier (e.g. bitcoin_core, counterparty:local, stamps_indexer)"},"version_string":{"type":"string","description":"Full version string (e.g. 28.0.0, 11.0.3, 1.8.26+canary.258)"},"version_major":{"type":"integer","nullable":true,"description":"Parsed major version number"},"version_minor":{"type":"integer","nullable":true,"description":"Parsed minor version number"},"version_revision":{"type":"integer","nullable":true,"description":"Parsed revision/patch version number"},"version_suffix":{"type":"string","nullable":true,"description":"Version suffix (e.g. canary.258, rc1)"},"extra_info":{"type":"object","nullable":true,"description":"Component-specific metadata (varies per component)"},"detected_at":{"type":"string","format":"date-time","description":"When this version was first detected"}}}}}}}},"example":{"status":"OK","services":{"api":true,"indexer":true,"mempool":true,"database":true,"blockSync":{"indexed":800000,"network":800001,"isSynced":true},"stats":{"src20Deployments":100000,"totalStamps":1000000},"nodeVersions":[{"component_name":"bitcoin_core","version_string":"28.0.0","version_major":28,"version_minor":0,"version_revision":0,"version_suffix":null,"extra_info":{"subversion":"/Satoshi:28.0.0/","protocolversion":70016,"connections":125},"detected_at":"2026-02-27T00:00:00.000Z"},{"component_name":"stamps_indexer","version_string":"1.8.26+canary.258","version_major":1,"version_minor":8,"version_revision":26,"version_suffix":"canary.258","extra_info":null,"detected_at":"2026-02-27T00:00:00.000Z"}]}}}}},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/docs":{"get":{"operationId":"getApiDocs","tags":["Documentation"],"summary":"API documentation","description":"Returns the OpenAPI documentation. Can be filtered by path or tag.","parameters":[{"in":"query","name":"path","schema":{"type":"string"},"description":"Optional path to filter documentation for a specific endpoint","example":"/api/v2/olga/mint"},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Optional tag to filter documentation by category","example":"Minting"}],"responses":{"200":{"description":"Successful response with API documentation","content":{"application/json":{"schema":{"oneOf":[{"description":"Full API documentation (no filters)","type":"object","required":["openapi","info","paths"],"properties":{"openapi":{"type":"string","description":"OpenAPI version","example":"3.0.3"},"info":{"type":"object","description":"API information","required":["title","version"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"}}},"paths":{"type":"object","description":"Formatted endpoint documentation"},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}},"servers":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"description":{"type":"string"}}}}}},{"description":"Filtered documentation response","type":"object","required":["documentation"],"properties":{"documentation":{"type":"array","items":{"type":"object","required":["path","method"],"properties":{"path":{"type":"string","description":"Endpoint path"},"method":{"type":"string","description":"HTTP method","enum":["GET","POST","PUT","DELETE","PATCH"]},"summary":{"type":"string","description":"Brief description of the endpoint"},"description":{"type":"string","description":"Detailed endpoint description"},"tags":{"type":"array","items":{"type":"string"},"description":"Associated tags"},"parameters":{"type":"array","description":"Endpoint parameters","items":{"type":"object"}},"requestBody":{"type":"object","nullable":true,"description":"Request body schema if applicable"},"responses":{"type":"array","description":"Possible responses","items":{"type":"object","properties":{"code":{"type":"string","description":"HTTP status code"},"description":{"type":"string","description":"Response description"},"content":{"type":"object"}}}}}}}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/version":{"get":{"operationId":"getApiVersion","tags":["System"],"summary":"Get API version","description":"Returns the current version of the API being used.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"string"}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/counterparty/version":{"get":{"operationId":"getCounterpartyVersion","tags":["System"],"summary":"Get the Counterparty node version","description":"Queries the configured Counterparty v2 API nodes in order and returns the\nversion string reported by the first reachable node. The response is never cached.\n","responses":{"200":{"description":"Version of the first reachable Counterparty node","content":{"application/json":{"schema":{"type":"object","required":["version"],"properties":{"version":{"type":"string","description":"Counterparty node version string","example":"11.3.0"}}}}}},"503":{"description":"No Counterparty node could be reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Unable to fetch Counterparty version"}}}}}}},"/api/v2/error":{"get":{"operationId":"testErrorResponse","tags":["System"],"summary":"Test error endpoint","description":"Test endpoint that always returns an error response. Used for testing error handling and responses.","responses":{"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseBody"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/versions":{"get":{"operationId":"getApiVersions","tags":["System"],"summary":"Get available API versions","description":"Returns information about all available API versions, their status, and migration information.\n\nUse the API-Version header to request a specific API version:\n- API-Version: 2.2 (stable, legacy)\n- API-Version: 2.3 (current, with enhanced market data)\n\nDefault version is 2.3 when no header is specified.\n","parameters":[{"in":"header","name":"API-Version","schema":{"type":"string","example":"2.3"},"description":"Specify the API version to use"}],"responses":{"200":{"description":"Available API versions and their status","content":{"application/json":{"schema":{"type":"object","properties":{"current":{"type":"string","description":"Current/latest API version","example":"2.3"},"requestedVersion":{"type":"string","description":"Version used for this request","example":"2.3"},"versions":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string","example":"2.3"},"status":{"type":"string","enum":["current","supported","deprecated"]},"releaseDate":{"type":"string","format":"date"},"endOfLife":{"type":"string","format":"date","nullable":true},"links":{"type":"object","properties":{"documentation":{"type":"string","format":"uri"},"changelog":{"type":"string","format":"uri"},"migration":{"type":"string","format":"uri","nullable":true}}}}}},"headers":{"type":"object","description":"Supported version headers"},"links":{"type":"object","properties":{"changelog":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"}}},"deprecationNotice":{"type":"object","nullable":true,"description":"Present if using deprecated version","properties":{"message":{"type":"string"},"migrationGuide":{"type":"string","format":"uri"},"currentVersion":{"type":"string"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/versions/changelog":{"get":{"operationId":"getApiChangelog","tags":["System"],"summary":"Get API version changelog","description":"Returns detailed changelog for all API versions including:\n- New features and fields added\n- Improvements and optimizations\n- Bug fixes\n- Deprecated features\n","responses":{"200":{"description":"API version changelog","content":{"application/json":{"schema":{"type":"object","properties":{"changelog":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string","example":"2.3.0"},"releaseDate":{"type":"string","format":"date"},"status":{"type":"string","enum":["current","supported","deprecated"]},"endOfLife":{"type":"string","format":"date","nullable":true},"changes":{"type":"object","properties":{"added":{"type":"array","items":{"type":"string"}},"improved":{"type":"array","items":{"type":"string"}},"fixed":{"type":"array","items":{"type":"string"}},"deprecated":{"type":"array","items":{"type":"string"}}}}}}},"currentVersion":{"type":"string","example":"2.3"},"deprecationPolicy":{"type":"object","properties":{"notice":{"type":"string","example":"6 months"},"support":{"type":"string","example":"12 months after deprecation"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/balance/{address}":{"get":{"operationId":"getAddressBalance","tags":["Balance"],"summary":"Get combined stamp and SRC-20 balances","description":"Convenience endpoint that combines stamp and SRC-20 balance data in a single request.\nFor better performance and pagination control, consider using the dedicated endpoints:\n- /api/v2/stamps/balance/{address}\n- /api/v2/src20/balance/{address}\n","parameters":[{"in":"path","name":"address","required":true,"example":"1GotRejB6XsGgMsM79TvcypeanDJRJbMtg","schema":{"type":"string"},"description":"The Bitcoin address to query"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response with combined balances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBalanceResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/balance/getStampsBalance":{"get":{"operationId":"getStampsBalanceByQuery","tags":["Balance"],"summary":"Get raw Counterparty stamp balances for an address","description":"Returns the Counterparty asset balances (stamps) held by an address, as reported by\nthe Counterparty v2 API. Unlike /api/v2/stamps/balance/{address} the result is not\nenriched with stamp metadata and is not paginated.\n","parameters":[{"in":"query","name":"address","required":true,"schema":{"type":"string"},"example":"bc1qhy8y5hajwqz56nzuqyqe9ghsvsxjkl3akmdrqp","description":"The Bitcoin address to query"},{"in":"query","name":"utxoOnly","required":false,"schema":{"type":"boolean","default":false},"description":"When \"true\", only balances attached to UTXOs are returned"}],"responses":{"200":{"description":"Counterparty balances for the address","content":{"application/json":{"schema":{"type":"object","required":["stampBalance"],"properties":{"stampBalance":{"type":"array","items":{"$ref":"#/components/schemas/XcpBalance"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/block/{block_index}":{"get":{"operationId":"getBlockInfo","tags":["Blocks"],"summary":"Get block info by block index or block hash","description":"Retrieves detailed information about a specific block, including transactions, stamps, and other block-related data.","parameters":[{"in":"path","name":"block_index","required":true,"example":"844755","schema":{"type":"string"},"description":"The block index or block hash"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockInfoResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/block/block_count/{number}":{"get":{"operationId":"getLastBlocks","tags":["Blocks"],"summary":"Get last x blocks","description":"Returns information about the most recent blocks, with the number of blocks specified in the request.","parameters":[{"in":"path","name":"number","required":true,"example":1,"schema":{"type":"integer"},"description":"The number of last blocks to retrieve"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlockRow"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/collections":{"get":{"operationId":"getCollections","tags":["Collections"],"summary":"Get paginated collections","description":"Retrieves a paginated list of all stamp collections.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCollectionResponseBody"}}}},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/collections/creator/{creator}":{"get":{"operationId":"getCollectionsByCreator","tags":["Collections"],"summary":"Get collections by creator","description":"Retrieves a paginated list of stamp collections for a specific creator.","parameters":[{"in":"path","name":"creator","required":true,"example":"bc1qefhvcqwuz6g6qy6nck5dq2el2r37pky73tqxkc","schema":{"type":"string"},"description":"Creator address to filter collections by"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCollectionResponseBody"}}}},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/collections/{id}":{"get":{"operationId":"getCollectionById","tags":["Collections"],"summary":"Get collection details by ID","description":"Returns detailed information for a specific collection by its UUID identifier.\nIncludes collection metadata, paginated stamps array, and aggregated market data\nfrom the collection_market_data table.\n","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{32}$"},"description":"Collection UUID (32 hex characters, with or without hyphens)","example":"550e8400e29b41d4a716446655440000"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"in":"query","name":"includeMarketData","schema":{"type":"boolean","default":true},"description":"Whether to include market data in the response"}],"responses":{"200":{"description":"Successful response with collection details","content":{"application/json":{"schema":{"type":"object","properties":{"collection_id":{"type":"string","description":"Collection UUID"},"collection_name":{"type":"string","description":"Collection name"},"collection_description":{"type":"string","description":"Collection description"},"creators":{"type":"array","items":{"type":"string"},"description":"Array of creator addresses"},"stamp_count":{"type":"integer","description":"Number of stamps in collection"},"total_editions":{"type":"number","description":"Total editions across all stamps"},"stamps":{"type":"array","items":{"$ref":"#/components/schemas/StampRow"},"description":"Paginated array of stamps in the collection"},"marketData":{"$ref":"#/components/schemas/CollectionMarketData","nullable":true,"description":"Aggregated market data from collection_market_data table"},"pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"totalPages":{"type":"integer"},"total":{"type":"integer"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"description":"Collection not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseBody"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/collections/by-name/{name}":{"get":{"operationId":"getCollectionByName","tags":["Collections"],"summary":"Get collection summary by name","description":"Looks up a single collection by its exact collection name and returns its\naggregate summary (creators, stamp count, total editions). Use\n/api/v2/collections/{id} for the paginated stamp list and market data.\n","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"},"example":"KEVIN","description":"Exact collection name"}],"responses":{"200":{"description":"Collection summary","content":{"application/json":{"schema":{"type":"object","properties":{"collection_id":{"type":"string","description":"Collection UUID (32 hex characters)"},"collection_name":{"type":"string"},"collection_description":{"type":"string","nullable":true},"creators":{"type":"array","items":{"type":"string"},"description":"Creator addresses"},"stamp_count":{"type":"integer","description":"Number of distinct stamps in the collection"},"total_editions":{"type":"number","description":"Sum of editions across all stamps in the collection"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/cursed":{"get":{"operationId":"getCursedStamps","tags":["Cursed Stamps"],"summary":"Get paginated cursed stamps","description":"Retrieves a paginated list of cursed stamps. Cursed stamps are stamps with negative stamp numbers that have been identified as invalid or problematic.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Sort"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedStampResponseBody"}}}},"404":{"$ref":"#/components/responses/NotFound"},"410":{"$ref":"#/components/responses/Gone"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/cursed/{id}":{"get":{"operationId":"getCursedStampById","tags":["Cursed Stamps"],"summary":"Get stamp by ID {tx_hash, stamp, cpid}","description":"Retrieves a specific cursed stamp by its identifier. Cursed stamps simply have a negative stamp number.\nThis endpoint is equivalent to /api/v2/stamps/{id} but specifically for cursed stamps.\n","parameters":[{"in":"path","name":"id","required":true,"example":"-2","schema":{"type":"string"},"description":"Stamp number, cpid, or stamp_hash"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StampResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"410":{"$ref":"#/components/responses/Gone"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/cursed/block":{"get":{"operationId":"getCursedStampsByLatestBlock","deprecated":true,"tags":["Cursed Stamps"],"summary":"Get cursed stamps in the latest block","description":"Returns block info and the cursed stamps created in the most recent indexed block.\nDeprecated in API v2.3 (the default version): requests return 410 Gone unless a\nlegacy API-Version header (2.2 or lower) is sent.\n","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StampBlockResponseBody"}}}},"410":{"$ref":"#/components/responses/Gone"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/cursed/block/{block_index}":{"get":{"operationId":"getCursedStampsByBlock","tags":["Cursed Stamps"],"summary":"Get cursed stamps by block index","description":"Retrieves all cursed stamps that were created or identified in a specific block.","parameters":[{"in":"path","name":"block_index","required":true,"example":781141,"schema":{"type":"integer"},"description":"The block index"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StampBlockResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"410":{"$ref":"#/components/responses/Gone"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20":{"get":{"operationId":"getSrc20Transactions","tags":["SRC-20"],"summary":"Get paginated valid SRC-20 transactions with market data filtering","description":"Retrieves a paginated list of valid SRC-20 transactions with optional market data filtering.\nThe new filters allow querying based on holder metrics, price ranges, volume, and data quality.\nAPI version 2.3 includes enhanced market data in responses.\n","parameters":[{"in":"header","name":"API-Version","schema":{"type":"string","default":"2.3","example":"2.3"},"description":"Specify the API version (2.2 for legacy format, 2.3 for enhanced market data)"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"name":"sort","in":"query","schema":{"type":"string","enum":["ASC","DESC","HOLDERS_DESC","HOLDERS_ASC","MARKET_CAP_DESC","MARKET_CAP_ASC","VALUE_DESC","VALUE_ASC","PRICE_DESC","PRICE_ASC","VOLUME_24H_DESC","VOLUME_24H_ASC","VOLUME_7D_DESC","VOLUME_7D_ASC","VOLUME_30D_DESC","VOLUME_30D_ASC","CHANGE_24H_DESC","CHANGE_24H_ASC","CHANGE_7D_DESC","CHANGE_7D_ASC","SUPPLY_DESC","SUPPLY_ASC","PROGRESS_DESC","PROGRESS_ASC","LIMIT_DESC","LIMIT_ASC","DECIMALS_DESC","DECIMALS_ASC","DEPLOY_DESC","DEPLOY_ASC","RECENT_DESC","RECENT_ASC","BLOCK_DESC","BLOCK_ASC","TICK_DESC","TICK_ASC","CREATOR_DESC","CREATOR_ASC"],"default":"DESC"},"description":"Comprehensive sort options for SRC-20 transactions:\n\n**⚠️ OPERATION-SPECIFIC RESTRICTIONS:**\n- **DEPLOY operations**: All sorting options available\n- **MINT/TRANSFER operations**: Limited to basic, activity, and alphabetical sorting only\n- **Market data and token metrics sorting**: Only available for DEPLOY operations\n\n**Basic Sorting (All Operations):**\n- ASC/DESC: Sort by block index (deploy date)\n- DEPLOY_DESC/DEPLOY_ASC: Sort by deploy date (block_index)\n- BLOCK_DESC/BLOCK_ASC: Sort by block index\n- TICK_DESC/TICK_ASC: Sort alphabetically by tick name\n- CREATOR_DESC/CREATOR_ASC: Sort by creator address\n\n**DEPLOY-Only Market Data Sorting:**\n- HOLDERS_DESC/HOLDERS_ASC: Sort by holder count\n- MARKET_CAP_DESC/MARKET_CAP_ASC: Sort by market cap (BTC)\n- VALUE_DESC/VALUE_ASC: Sort by floor price/market value\n- PRICE_DESC/PRICE_ASC: Alias for VALUE sorting\n- VOLUME_24H/7D/30D_DESC/ASC: Sort by trading volume\n- CHANGE_24H/7D_DESC/ASC: Sort by price change percentage\n\n**DEPLOY-Only Token Metrics Sorting:**\n- SUPPLY_DESC/SUPPLY_ASC: Sort by max supply (numeric)\n- PROGRESS_DESC/PROGRESS_ASC: Sort by mint progress percentage\n- LIMIT_DESC/LIMIT_ASC: Sort by mint limit per transaction\n- DECIMALS_DESC/DECIMALS_ASC: Sort by token decimals\n\n**MINT/TRANSFER-Only Sorting:**\n- AMOUNT_DESC/AMOUNT_ASC: Sort by transaction amount\n- RECENT_DESC/RECENT_ASC: Sort by recent activity (block_time)\n\n**Example Usage:**\n- `?op=DEPLOY&sortBy=SUPPLY_DESC` ✅ Valid\n- `?op=MINT&sortBy=SUPPLY_DESC` ❌ Invalid - returns error\n- `?op=MINT&sortBy=AMOUNT_DESC` ✅ Valid\n"},{"name":"minHolderCount","in":"query","description":"Minimum number of holders for the SRC-20 token","schema":{"type":"integer","minimum":0},"example":10},{"name":"maxHolderCount","in":"query","description":"Maximum number of holders for the SRC-20 token","schema":{"type":"integer","minimum":0},"example":1000},{"name":"minFloorPriceBTC","in":"query","description":"Minimum floor price in BTC","schema":{"type":"number","format":"float","minimum":0},"example":0.00001},{"name":"maxFloorPriceBTC","in":"query","description":"Maximum floor price in BTC","schema":{"type":"number","format":"float","minimum":0},"example":0.1},{"name":"minVolume24h","in":"query","description":"Minimum 24-hour trading volume in BTC","schema":{"type":"number","format":"float","minimum":0},"example":0.001},{"name":"minPriceChange24h","in":"query","description":"Minimum 24-hour price change percentage","schema":{"type":"number","format":"float"},"example":-10},{"name":"minDataQualityScore","in":"query","description":"Minimum data quality score (0-10)","schema":{"type":"integer","minimum":0,"maximum":10},"example":7},{"name":"primaryExchange","in":"query","description":"Filter by primary exchange source","schema":{"type":"string"},"example":"openstamp"},{"name":"mintingStatus","in":"query","description":"Filter tokens by minting status (v2.3+)\n- all: Return all tokens (default)\n- minting: Return only tokens still being minted (progress < 100%)\n- minted: Return only fully minted tokens (progress = 100%)\n","schema":{"type":"string","enum":["all","minting","minted"],"default":"all"}},{"name":"includeProgress","in":"query","description":"Include detailed mint progress data in the response.\nAdds mint_progress object with progress percentage, current minted amount, and max supply.\n","schema":{"type":"boolean","default":false},"example":true},{"name":"includeMarketData","in":"query","description":"Include comprehensive market data in the response.\nAdds market_data object with price, volume, holder count, and change metrics.\nNote: Automatically included for DEPLOY operations.\n","schema":{"type":"boolean","default":false},"example":true},{"name":"trendingWindow","in":"query","description":"Time window for trending calculations and volume metrics","schema":{"type":"string","enum":["24h","7d","30d"]},"example":"24h"},{"name":"mintVelocityMin","in":"query","description":"Minimum minting velocity (tokens minted per hour) to filter by","schema":{"type":"number","format":"float","minimum":0},"example":100.5}],"responses":{"200":{"description":"Successful response with paginated SRC-20 transactions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc20ResponseBody"}}}},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/search":{"get":{"operationId":"searchSrc20Tokens","tags":["SRC-20"],"summary":"Search SRC-20 tokens","description":"Searches deployed SRC-20 tokens by tick (partial match) or by deploy tx_hash.\nReturns at most 10 results, with exact-prefix tick matches first. An empty or\nunrecognised query returns an empty list.\n","parameters":[{"in":"query","name":"q","required":true,"schema":{"type":"string"},"example":"KEVIN","description":"Search term (tick or tx_hash)"},{"in":"query","name":"mintable_only","required":false,"schema":{"type":"boolean","default":false},"description":"When \"true\", only tokens that are not yet fully minted are returned"}],"responses":{"200":{"description":"Matching SRC-20 tokens","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Src20SearchResult"}}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/{op}":{"get":{"operationId":"getSrc20TransactionsByOp","tags":["SRC-20"],"summary":"Get paginated SRC-20 transactions filtered by operation","description":"Returns valid SRC-20 transactions for a single operation type. The op segment is\ncase-insensitive (deploy, mint, transfer). This is the basic transaction listing\nwithout the market-data enrichment of /api/v2/src20.\n","parameters":[{"in":"path","name":"op","required":true,"schema":{"type":"string","enum":["deploy","mint","transfer"]},"example":"mint","description":"SRC-20 operation type (case-insensitive)"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Sort"}],"responses":{"200":{"description":"Paginated SRC-20 transactions for the operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc20ResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/balance/{address}":{"get":{"operationId":"getSrc20AddressBalance","tags":["SRC-20","Balance"],"summary":"Get SRC-20 balances by BTC wallet address","description":"Retrieves all SRC-20 token balances for a specific Bitcoin address.\nAPI version 2.3 includes enhanced market data in nested marketData objects.\nAPI version 2.2 maintains legacy flat structure for backward compatibility.\n","parameters":[{"in":"path","name":"address","required":true,"description":"The address of the wallet","schema":{"type":"string"},"example":"1GotRejB6XsGgMsM79TvcypeanDJRJbMtg"},{"in":"header","name":"API-Version","schema":{"type":"string","default":"2.3","example":"2.3"},"description":"Specify the API version (2.2 for legacy format, 2.3 for enhanced market data)"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response with SRC-20 balance data","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/PaginatedSrc20BalanceResponseBody"},{"$ref":"#/components/schemas/PaginatedSrc20WithMarketDataResponseBody"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/balance/{address}/{tick}":{"get":{"operationId":"getSrc20AddressTickBalance","tags":["SRC-20","Balance"],"summary":"Get SRC-20 balance by address and tick","description":"Retrieves the balance of a specific SRC-20 token (identified by tick) for a given Bitcoin address.","parameters":[{"in":"path","name":"address","required":true,"example":"bc1qx6tg7nls0u949wy8eudwcaw0rcq0vl7ehh6p9l","schema":{"type":"string"},"description":"The address of the wallet"},{"in":"path","name":"tick","required":true,"example":"STAMP","schema":{"type":"string"},"description":"The tick value"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Src20BalanceResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/balance/snapshot/{tick}":{"get":{"operationId":"getSrc20TickSnapshot","tags":["SRC-20","Balance"],"summary":"Get SRC-20 balance snapshot by tick on current block height","description":"Retrieves a snapshot of all owners for the SRC-20 tick value based upon the current block height.\nThis provides a complete overview of token distribution at the current point in time.\n","parameters":[{"in":"path","name":"tick","required":true,"example":"KEVIN","schema":{"type":"string"},"description":"The SRC20 tick value"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Src20SnapshotResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/block/{block_index}":{"get":{"operationId":"getSrc20BlockTransactions","tags":["SRC-20"],"summary":"Get paginated valid SRC-20 transactions from a specific block","description":"Retrieves all SRC-20 transactions that occurred in a specific block. Results can be filtered and paginated.","parameters":[{"in":"path","name":"block_index","required":true,"example":844757,"schema":{"type":"integer"},"description":"The index of the block"},{"in":"query","name":"op","required":false,"schema":{"type":"string"},"description":"The operation type, if applicable."},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Sort"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc20ResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/block/{block_index}/{tick}":{"get":{"operationId":"getSrc20BlockTickTransactions","tags":["SRC-20"],"summary":"Fetches SRC20 transactions for a given block and tick","description":"Retrieves SRC20 transactions filtered by block index and tick value, with additional optional filtering and pagination parameters.","parameters":[{"in":"path","name":"block_index","required":true,"example":844757,"schema":{"type":"integer","format":"int32"},"description":"The index of the block."},{"in":"path","name":"tick","required":true,"example":"STAMP","schema":{"type":"string"},"description":"The tick value, possibly represented as an emoji."},{"in":"query","name":"op","required":false,"schema":{"type":"string","enum":["TRANSFER","MINT","DEPLOY"]},"description":"The operation type, if applicable."},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response with the list of valid SRC-20 transactions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc20ResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/tick":{"get":{"operationId":"getSrc20TickOperations","tags":["SRC-20"],"summary":"Get paginated valid SRC-20 transactions by operation type","description":"Retrieve paginated valid SRC-20 transactions by operation type (DEPLOY, MINT, TRANSFER)","parameters":[{"in":"query","name":"op","schema":{"type":"string","default":"DEPLOY","enum":["TRANSFER","MINT","DEPLOY"]},"description":"The operation type [TRANSFER, MINT, DEPLOY(DEFAULT)]"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Sort"}],"responses":{"200":{"description":"Successful response with paginated SRC-20 transactions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc20ResponseBody"}}}},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/tick/{tick}":{"get":{"operationId":"getSrc20TickData","tags":["SRC-20"],"summary":"Get paginated tick data","description":"Retrieve paginated tick data for a specific tick","parameters":[{"in":"path","name":"tick","required":true,"example":"KEVIN","description":"Tick value","schema":{"type":"string"}},{"in":"query","name":"op","schema":{"type":"string","default":"DEPLOY","enum":["TRANSFER","MINT","DEPLOY"]},"description":"The operation type [TRANSFER, MINT, DEPLOY]"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedTickResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/tick/{tick}/deploy":{"get":{"operationId":"getSrc20TickDeployInfo","tags":["SRC-20"],"summary":"Get deployment details for a specific tick","description":"Retrieve deployment details for a specific tick in the tick API.","parameters":[{"in":"path","name":"tick","required":true,"example":"KEVIN","description":"The tick value.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response with deployment details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TickResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/tick/{tick}/mintData":{"get":{"operationId":"getSrc20TickMintData","tags":["SRC-20"],"summary":"Get mint progress and holder count for a tick","description":"Returns the minting progress of an SRC-20 token together with the number of\nholders. mintStatus is null when the tick has no DEPLOY record.\n","parameters":[{"in":"path","name":"tick","required":true,"schema":{"type":"string"},"example":"KEVIN","description":"Tick value (URL-encoded if it contains emoji)"}],"responses":{"200":{"description":"Mint progress and holder count","content":{"application/json":{"schema":{"type":"object","required":["mintStatus","holders"],"properties":{"mintStatus":{"$ref":"#/components/schemas/SRC20MintProgress","nullable":true},"holders":{"type":"integer","description":"Number of addresses holding the token"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/tx/{tx_hash}":{"get":{"operationId":"getSrc20TransactionInfo","tags":["SRC-20"],"summary":"Get information about a specific transaction","description":"Retrieves detailed information about a specific SRC-20 transaction by its transaction hash.","parameters":[{"in":"path","name":"tx_hash","required":true,"example":"9d5451a3ae07a6fe92907cef3c649f52544b8b4e67a6cae848b14e1d8047b5a4","schema":{"type":"string"},"description":"The hash of the transaction."}],"responses":{"200":{"description":"Successful response with transaction information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Src20ResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/market":{"get":{"operationId":"getSrc20MarketData","tags":["SRC-20"],"summary":"Get paginated SRC-20 market data","description":"Returns paginated SRC-20 market data from the src20_market_data cache table.\nAll data includes USD values calculated from BTC prices and current BTC/USD rate.\nMarket data is refreshed periodically from exchange sources.\n","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"in":"query","name":"sort","schema":{"type":"string","enum":["market_cap_usd","volume_24h_btc","price_change_24h_percent"],"default":"market_cap_usd"},"description":"Field to sort by"},{"in":"query","name":"order","schema":{"type":"string","enum":["asc","desc"],"default":"desc"},"description":"Sort order (ascending or descending)"}],"responses":{"200":{"description":"Successful response with paginated market data","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SRC20MarketDataRow"}},"total":{"type":"integer","description":"Total number of tokens with market data"},"page":{"type":"integer","description":"Current page number"},"limit":{"type":"integer","description":"Items per page"},"totalPages":{"type":"integer","description":"Total number of pages"},"last_block":{"type":"integer","description":"Last indexed block height"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/market/{tick}":{"get":{"operationId":"getSrc20MarketDataByTick","tags":["SRC-20"],"summary":"Get market data for a specific SRC-20 token","description":"Returns market data for a specific SRC-20 token from the src20_market_data cache table.\nUses case-insensitive tick matching. Returns complete market data including USD values.\nUSD values are calculated from BTC prices using current BTC/USD rate.\n","parameters":[{"in":"path","name":"tick","required":true,"schema":{"type":"string"},"description":"SRC-20 token tick symbol (case-insensitive)","example":"KEVIN"}],"responses":{"200":{"description":"Successful response with market data for the token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SRC20MarketDataRow"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"description":"Market data not found for the specified token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseBody"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101":{"get":{"operationId":"getSrc101Transactions","tags":["SRC-101"],"summary":"Get paginated valid SRC-101 transactions","description":"Retrieve paginated valid SRC-101 transactions with optional limit and page parameters","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response with paginated SRC-101 transactions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc101ResponseBody"}}}},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/tx":{"get":{"operationId":"getSrc101TransactionList","tags":["SRC-101"],"summary":"Get paginated SRC-101 transactions","description":"Retrieve paginated SRC-101 transactions with optional filtering by block index, operation type, and validation status.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"in":"query","name":"block_index","schema":{"type":"integer"},"description":"Filter transactions by block index"},{"in":"query","name":"op","schema":{"type":"string","enum":["mint","transfer"]},"description":"Filter by operation type, either \"mint\" or \"transfer\""},{"in":"query","name":"deploy_hash","schema":{"type":"string"},"description":"Filter by deployment transaction hash"},{"in":"query","name":"valid","schema":{"type":"integer","enum":[0,1]},"description":"Filter by validation status (1 for valid, 0 for invalid)"}],"responses":{"200":{"description":"Successful response with paginated SRC-101 transactions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc101ResponseBody"}}}},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/tx/{tx_hash}":{"get":{"operationId":"getSrc101TransactionByHash","tags":["SRC-101"],"summary":"Get SRC-101 transaction by hash","description":"Retrieve detailed information about a specific SRC-101 transaction using its transaction hash.","parameters":[{"in":"path","name":"tx_hash","required":true,"example":"bc1ppwujuuj8ejh4qu5lpfftgmfg3yue7ml7ge8vgzyqzmpu5rc9ttmsrkaeh8","schema":{"type":"string"},"description":"The hash of the transaction"}],"responses":{"200":{"description":"Successful response with transaction details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc101ResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/{deploy_hash}/deploy":{"get":{"operationId":"getSrc101DeployInfo","tags":["SRC-101"],"summary":"Get SRC-101 deployment details","description":"Retrieve comprehensive deployment information for a specific SRC-101 token using its deployment transaction hash.","parameters":[{"in":"path","name":"deploy_hash","required":true,"example":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","schema":{"type":"string"},"description":"The hash of the deploy transaction"}],"responses":{"200":{"description":"Successful response with deployment details","content":{"application/json":{"schema":{"type":"object","properties":{"last_block":{"type":"number"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Src101Detail"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/{deploy_hash}":{"get":{"operationId":"getSrc101Owner","tags":["SRC-101"],"summary":"Get SRC-101 from owners table","description":"Return all src101 data that matches the rule by filtering","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"in":"path","name":"deploy_hash","required":true,"example":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","schema":{"type":"string"},"description":"The hash of the deploy transaction"},{"in":"query","name":"expire","schema":{"type":"integer"},"description":"0 is false, 1 is true. false means there are no expired domain names"}],"responses":{"200":{"description":"Successful response with deployment details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc101ResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/{deploy_hash}/total":{"get":{"operationId":"getSrc101TotalSupply","tags":["SRC-101"],"summary":"Get total supply for SRC-101 token","description":"Retrieve the total supply and related statistics for a specific SRC-101 token using its deployment hash.","parameters":[{"in":"path","name":"deploy_hash","required":true,"example":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","schema":{"type":"string"},"description":"The hash of the deploy transaction"}],"responses":{"200":{"description":"Successful response with total supply information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotalSrc101ResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/{deploy_hash}/address/{address_btc}":{"get":{"operationId":"getSrc101TokensByAddress","tags":["SRC-101"],"summary":"Get tokenid of SRC-101 by address_btc","description":"Retrieve deployment details for a specific deploy_hash in the deploy_hash API.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"in":"query","name":"prim","required":true,"example":"false","schema":{"type":"string"}},{"in":"path","name":"deploy_hash","required":true,"example":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","description":"The hash of the deploy transaction.","schema":{"type":"string"}},{"in":"path","name":"address_btc","required":true,"example":"bc1qhhv6rmxvq5mj2fc3zne2gpjqduy45urapje64m","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response with deployment details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenidSrc101ResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/balance/{address}":{"get":{"operationId":"getSrc101AddressBalance","tags":["SRC-101","Balance"],"summary":"Get SRC-101 balances by address","description":"Retrieve all SRC-101 token balances for a specific Bitcoin address, including details about each token held.","parameters":[{"in":"path","name":"address","required":true,"example":"bc1qhhv6rmxvq5mj2fc3zne2gpjqduy45urapje64m","schema":{"type":"string"},"description":"The Bitcoin address to query"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response with address balances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSrc101BalanceResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/{deploy_hash}/{tokenid}":{"get":{"operationId":"getSrc101TokenInfo","tags":["SRC-101"],"summary":"Get SRC-101 token information","description":"Retrieve detailed information about a specific SRC-101 token using its deployment hash and token identifier.","parameters":[{"in":"path","name":"deploy_hash","required":true,"example":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","schema":{"type":"string"},"description":"The deployment transaction hash"},{"in":"path","name":"tokenid","required":true,"example":"aXJvbmI==","schema":{"type":"string"},"description":"The unique token identifier"}],"responses":{"200":{"description":"Successful response with token information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Src101BalanceResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/index/{deploy_hash}/{index}":{"get":{"operationId":"getSrc101TokenByIndex","tags":["SRC-101"],"summary":"Get SRC-101 token by index","description":"Retrieve token information using its deployment hash and numeric index. This endpoint provides an alternative way to access token data.","parameters":[{"in":"path","name":"deploy_hash","required":true,"example":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","schema":{"type":"string"},"description":"The deployment transaction hash"},{"in":"path","name":"index","required":true,"example":1,"schema":{"type":"number"},"description":"The numeric index of the token"}],"responses":{"200":{"description":"Successful response with token information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Src101BalanceResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src101/create":{"post":{"operationId":"createSrc101","tags":["SRC-101"],"summary":"Deploy, Mint, Transfer SRC-101, SetRecord, Renew","description":"This returns a hex encoded serialized PSBT transaction ready for signing and broadcasting\nvia wallet or library.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"discriminator":{"propertyName":"op","mapping":{"deploy":"#/components/schemas/SRC101DeployData","mint":"#/components/schemas/SRC101MintData","transfer":"#/components/schemas/SRC101TransferData","setrecord":"#/components/schemas/SRC101SetRecordData","renew":"#/components/schemas/SRC101RenewData"}}},"examples":{"deploy":{"summary":"Deploy example","value":{"sourceAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","changeAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","op":"deploy","root":"btc","name":"BitNameService","lim":"10","owner":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","rec":["bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9"],"tick":"btc","pri":{"0":45000,"1":-1,"2":-1,"3":900000,"4":225000},"desc":"Bitname Service powered by BTC stamp.","mintstart":"0","mintend":"18446744073709551615","wla":"0317ac27154373716ab3bce4f170211446e7598c69ae3a90f058c831c56308323c","imglp":"https://img.bitname.pro/img/","imgf":"png","idua":"999","feeRate":96}},"mint":{"summary":"Mint example","value":{"sourceAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","changeAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","recAddress":"bc1qkt6zxc6dl9xuf2wm8txna2g96yac3spukxvvtk","op":"mint","hash":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","toaddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","tokenid":["YWJjZGVm"],"dua":"999","prim":"true","coef":"1000","sig":"","feeRate":24}},"transfer":{"summary":"Transfer example","value":{"sourceAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","changeAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","tokenid":"YWJjZGVm","op":"transfer","hash":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","toaddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","tick":"bns","feeRate":24}},"setrecord":{"summary":"Set record example","value":{"sourceAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","changeAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","op":"setrecord","hash":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","tokenid":"YWJjZGVm","type":"address","data":{"btc":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9"},"prim":"true","feeRate":24}},"renew":{"summary":"Renew example","value":{"sourceAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","changeAddress":"bc1q7hfpkd39tqe7lske5uyhaj7y2adrjfuaufceu9","recAddress":"bc1qkt6zxc6dl9xuf2wm8txna2g96yac3spukxvvtk","op":"renew","hash":"77fb147b72a551cf1e2f0b37dccf9982a1c25623a7fe8b4d5efaac566cf63fed","tokenid":"YWJjZGVm","dua":"999","feeRate":24}}}}}},"responses":{"200":{"description":"Successful response with the hex value.","content":{"application/json":{"schema":{"type":"object","properties":{"hex":{"type":"string","description":"The hex encoded serialized psbt trx"},"base64":{"type":"string","description":"The base64 encoded serialized psbt trx"},"input_value":{"type":"integer","description":"The input value in sats"},"total_dust_value":{"type":"integer","description":"The total dust value in sats"},"est_miner_fee":{"type":"integer","description":"The estimated miner fee in sats"},"est_tx_size":{"type":"integer","description":"The estimated transaction size"},"inputsToSign":{"type":"array","items":{"type":"string","description":"The inputs to sign"}},"changeAddress":{"type":"string","description":"The change address"},"fee":{"type":"integer","description":"The estimated miner fee in sats"},"change":{"type":"integer","description":"The change value"}}}}}},"400":{"description":"Bad request error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseBody"}}}}}}},"/api/v2/stamps":{"get":{"operationId":"getStamps","tags":["Stamps"],"summary":"Get paginated stamps with advanced filtering","description":"Retrieve a paginated list of stamps with advanced market data filtering capabilities.\nThe new market data filters allow querying based on holder metrics, price ranges,\nvolume, and data quality - features enabled by the market data cache system.\n","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/Sort"},{"name":"minHolderCount","in":"query","description":"Minimum number of holders for the stamp","schema":{"type":"integer","minimum":0},"example":10},{"name":"maxHolderCount","in":"query","description":"Maximum number of holders for the stamp","schema":{"type":"integer","minimum":0},"example":1000},{"name":"minDistributionScore","in":"query","description":"Minimum holder distribution score (0-100, higher = more distributed)","schema":{"type":"integer","minimum":0,"maximum":100},"example":50},{"name":"maxTopHolderPercentage","in":"query","description":"Maximum percentage held by top holder (0-100)","schema":{"type":"integer","minimum":0,"maximum":100},"example":25},{"name":"minFloorPriceBTC","in":"query","description":"Minimum floor price in BTC","schema":{"type":"number","format":"float","minimum":0},"example":0.001},{"name":"maxFloorPriceBTC","in":"query","description":"Maximum floor price in BTC","schema":{"type":"number","format":"float","minimum":0},"example":1},{"name":"minVolume24h","in":"query","description":"Minimum 24-hour trading volume in BTC","schema":{"type":"number","format":"float","minimum":0},"example":0.01},{"name":"minPriceChange24h","in":"query","description":"Minimum 24-hour price change percentage (can be negative)","schema":{"type":"number","format":"float"},"example":-10},{"name":"minDataQualityScore","in":"query","description":"Minimum data quality score (0-10, higher = better quality)","schema":{"type":"integer","minimum":0,"maximum":10},"example":7},{"name":"maxCacheAgeMinutes","in":"query","description":"Maximum age of cached market data in minutes","schema":{"type":"integer","minimum":0},"example":60},{"name":"priceSource","in":"query","description":"Filter by price data source (comma-separated for multiple)","schema":{"type":"string"},"example":"counterparty,openstamp"}],"responses":{"200":{"description":"Successful response with paginated stamps.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedStampResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/{id}":{"get":{"operationId":"getStampById","tags":["Stamps"],"summary":"Get stamp by ID","description":"Retrieve a specific stamp using its ID (tx_hash, stamp number, or cpid).","parameters":[{"in":"path","name":"id","required":true,"example":"5faa1aa3012c89b598372153371f835a88739e5539c9c709924ce189fb9c7863","description":"ID (tx_hash, stamp, cpid) of the stamp","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StampResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/{id}/holders":{"get":{"operationId":"getStampHolders","tags":["Stamps"],"summary":"Get holders for a specific stamp","description":"Retrieve all current holders of a specific stamp.","parameters":[{"in":"path","name":"id","required":true,"example":"792121","schema":{"type":"string"},"description":"Stamp number, cpid, or stamp_hash"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"quantity":{"type":"number"}}}}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/{id}/dispensers":{"get":{"operationId":"getStampDispensersById","tags":["Stamps","Dispensers"],"summary":"Get all dispensers for a specific stamp","description":"Retrieve all dispensers (open and closed) for a specific stamp.","parameters":[{"in":"path","name":"id","required":true,"example":"792121","schema":{"type":"string"},"description":"Stamp number, cpid, or stamp_hash"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DispenserRow"}}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/dispensers/{address}":{"get":{"operationId":"getAddressDispensers","tags":["Stamps","Dispensers"],"summary":"Get all dispensers opened by a wallet address","description":"Retrieve all dispensers (open and closed) opened by a wallet address, each enriched with its stamp metadata.","parameters":[{"in":"path","name":"address","required":true,"example":"bc1q20d2cdvy2x83h3ssrz5lgryy4c9wqxsgc749ej","schema":{"type":"string"},"description":"Bitcoin wallet address"},{"in":"query","name":"status","required":false,"schema":{"type":"string","enum":["open","closed"]},"description":"Filter by dispenser status (omit for all)"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DispenserRow"}}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/{id}/sends":{"get":{"operationId":"getStampSends","tags":["Stamps"],"summary":"Get send history for a specific stamp","description":"Retrieve the complete transfer history for a specific stamp.","parameters":[{"in":"path","name":"id","required":true,"example":"792121","schema":{"type":"string"},"description":"Stamp number, cpid, or stamp_hash"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"tx_hash":{"type":"string"},"block_index":{"type":"number"},"source":{"type":"string"},"destination":{"type":"string"},"quantity":{"type":"number"},"block_time":{"type":"string","format":"date-time"}}}}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/{id}/dispenses":{"get":{"operationId":"getStampDispenses","tags":["Stamps","Dispensers"],"summary":"Get dispense history for a specific stamp","description":"Retrieve the complete dispense history for a specific stamp.","parameters":[{"in":"path","name":"id","required":true,"example":"792121","schema":{"type":"string"},"description":"Stamp number, cpid, or stamp_hash"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DispenseRow"}}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/balance/{address}":{"get":{"operationId":"getStampBalance","tags":["Stamps","Balance"],"summary":"Get stamp balances by address with optional enhanced features","description":"Retrieve all stamp balances for a specific Bitcoin address.\nUse the 'enhanced=true' parameter to enable advanced features including:\n- Market data integration with individual stamp values\n- Advanced sorting options (value, quantity, stamp number, recent activity)\n- Bulk market data optimization for better performance\n","parameters":[{"in":"path","name":"address","required":true,"example":"1GotRejB6XsGgMsM79TvcypeanDJRJbMtg","description":"The address to retrieve stamp balances for","schema":{"type":"string"}},{"in":"query","name":"enhanced","schema":{"type":"boolean","default":true},"description":"Enable enhanced features with market data and advanced sorting"},{"in":"query","name":"sortBy","schema":{"type":"string","default":"DESC","enum":["ASC","DESC","value_desc","value_asc","quantity_desc","quantity_asc","stamp_desc","stamp_asc","recent_desc","recent_asc"]},"description":"Sort order for stamps (requires enhanced=true for advanced options)"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response with stamp balance data","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/PaginatedStampBalanceResponseBody"},{"$ref":"#/components/schemas/EnhancedStampBalanceResponseBody"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/block":{"get":{"operationId":"getStampsByLatestBlock","tags":["Stamps"],"summary":"Get stamps in the latest block","description":"Returns block info and the stamps created in the most recent indexed block.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StampBlockResponseBody"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/block/{block_index}":{"get":{"operationId":"getStampsByBlock","tags":["Stamps"],"summary":"Get stamps by block index","description":"Retrieve all stamps that were created in a specific block.","parameters":[{"in":"path","name":"block_index","required":true,"example":"779652","schema":{"type":"string"},"description":"The index of the block"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StampBlockResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/ident/{ident}":{"get":{"operationId":"getStampsByIdent","tags":["Stamps"],"summary":"Get stamps by ident","description":"Retrieve stamps based on their identifier type (SRC-721, STAMP).","parameters":[{"in":"path","name":"ident","required":true,"example":"STAMP","description":"The ident value (SRC-721, STAMP)","schema":{"type":"string"}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response with the paginated stamps","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedIdResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/recent-sales":{"get":{"operationId":"getRecentStampSales","tags":["Stamps"],"summary":"Get recent stamp sales with enhanced details","description":"Retrieve recent stamp sales (dispenses) with enhanced transaction details and configurable time range.\nThis endpoint provides comprehensive information about stamp sales including transaction metadata,\nblock information, and optional full transaction details.\n","parameters":[{"name":"dayRange","in":"query","description":"Number of days to look back for sales (default 7, max 30)","schema":{"type":"integer","minimum":1,"maximum":30,"default":7},"example":7},{"name":"fullDetails","in":"query","description":"Include full transaction details in response","schema":{"type":"boolean","default":false},"example":false},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Page"}],"responses":{"200":{"description":"Successful response with recent stamp sales","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecentStampSalesResponseBody"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamps/search":{"get":{"operationId":"searchStamps","tags":["Stamps"],"summary":"Search stamps by query string","description":"Search for stamps by CPID, stamp number, transaction hash, creator address, or ticker.\nThe input is automatically classified and routed to the appropriate query type.\nReturns a simplified result set suitable for search/autocomplete interfaces.\n","parameters":[{"name":"q","in":"query","required":true,"description":"Search query string. Automatically classified as one of:\n- **cpid**: Matches CPID pattern (e.g., \"A1234567890\")\n- **stamp_number**: Numeric input interpreted as stamp number\n- **tx_hash**: 64-character hex string matching transaction hash\n- **address**: Bitcoin address (1/3/bc1 prefix)\n- **ticker**: Falls through to generic LIKE search on cpid, creator, and tx_hash\n","schema":{"type":"string"},"example":"KEVIN"}],"responses":{"200":{"description":"Successful response with matching stamps","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StampSearchResponseBody"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/stamp/{stamp}/preview":{"get":{"operationId":"getStampPreview","tags":["Stamps"],"summary":"Get a 1200x1200 social-media preview image for a stamp","description":"Renders (and caches) a 1200x1200 PNG preview of the stamp content. Depending on the\nstorage backend the image is either returned inline (image/png) or served via a 302\nredirect to the CDN copy. When rendering fails the endpoint 302-redirects to the\ngeneric Stampchain logo, or returns 404 when placeholderOnFail=true. With\nformat=gif an animated GIF is generated for animated HTML stamps; non-animated\nstamps redirect to the PNG preview instead.\n","parameters":[{"in":"path","name":"stamp","required":true,"schema":{"type":"string"},"example":"1","description":"Stamp number, cpid, or tx_hash"},{"in":"query","name":"format","required":false,"schema":{"type":"string","enum":["png","gif"],"default":"png"},"description":"Preview format"},{"in":"query","name":"refresh","required":false,"schema":{"type":"boolean","default":false},"description":"When \"true\", discards any cached preview and re-renders"},{"in":"query","name":"placeholderOnFail","required":false,"schema":{"type":"boolean","default":false},"description":"When \"true\", return 404 instead of redirecting to the fallback logo on render failure"}],"responses":{"200":{"description":"Rendered PNG preview","content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"302":{"description":"Redirect to the CDN-hosted preview image or to the fallback logo","headers":{"Location":{"schema":{"type":"string"},"description":"URL of the preview image (or the fallback logo)"},"X-Fallback":{"schema":{"type":"string"},"description":"Present only on fallback redirects; reason the render failed"}}},"400":{"description":"Unsupported format parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Preview unavailable (only when placeholderOnFail=true)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v2/src20/create":{"post":{"operationId":"createSrc20Token","tags":["Minting","SRC-20"],"summary":"Deploy, Mint, Transfer SRC-20 Tokens","description":"This returns a hex encoded serialized PSBT transaction ready for signing and broadcasting\nvia wallet or library.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"discriminator":{"propertyName":"op","mapping":{"deploy":"#/components/schemas/SRC20DeployData","mint":"#/components/schemas/SRC20MintData","transfer":"#/components/schemas/SRC20TransferData"}}},"examples":{"deploy":{"summary":"Deploy example","value":{"toAddress":"bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2","changeAddress":"bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2","op":"deploy","tick":"APIV2","satsPerVB":12,"max":"2100000000","lim":"100000","dec":18,"x":"bitcoin_stamps","web":"https://stampchain.io","email":"contact@stampchain.io","tg":"stampchain_official","description":"API Version 2 test token with full metadata","img":"ar:BNttzDav3jHVnNiV7nYbQv-GY0HQ","icon":"ipfs:QmXoypizjW3WknFiJnKLwHCNqzg"}},"mint":{"summary":"Mint example","value":{"toAddress":"bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2","changeAddress":"bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2","op":"mint","tick":"DOGE","satsPerVB":20,"amt":"1000"}},"transfer":{"summary":"Transfer example","value":{"fromAddress":"bc1qdnksce7dgfsehtdxgz6fzdj2k6qfvmyf8uc2vv","toAddress":"bc1qazcm763858nkj2dj986etajv6wquslv8uxwczt","changeAddress":"bc1qdnksce7dgfsehtdxgz6fzdj2k6qfvmyf8uc2vv","op":"transfer","tick":"STAMP","satsPerVB":20,"amt":"100000"}}}}}},"responses":{"200":{"description":"Successful response with the hex value.","content":{"application/json":{"schema":{"type":"object","properties":{"hex":{"type":"string","description":"The hex encoded serialized psbt trx"},"input_value":{"type":"integer","description":"The input value in sats"},"total_dust_value":{"type":"integer","description":"The total dust value in sats"},"est_miner_fee":{"type":"integer","description":"The estimated miner fee in sats"},"est_tx_size":{"type":"integer","description":"The estimated transaction size"},"inputsToSign":{"type":"array","items":{"type":"string","description":"The inputs to sign"}},"changeAddress":{"type":"string","description":"The change address"},"fee":{"type":"integer","description":"The estimated miner fee in sats"},"change":{"type":"integer","description":"The change value"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/src20/multisig/{operation}":{"post":{"operationId":"createSrc20MultisigTransaction","tags":["Minting","SRC-20"],"summary":"Build a multisig-encoded SRC-20 deploy, mint, or transfer PSBT","description":"Builds an unsigned PSBT that encodes the SRC-20 operation using bare multisig\noutputs (legacy encoding) instead of the OLGA/P2WSH encoding used by\n/api/v2/src20/create. The operation-specific fields are validated by the\noperation (mint checks minted-out, transfer checks the sender balance).\n","parameters":[{"in":"path","name":"operation","required":true,"schema":{"type":"string","enum":["deploy","mint","transfer"]},"description":"SRC-20 operation (case-insensitive)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/SRC20MultisigDeployRequest"},{"$ref":"#/components/schemas/SRC20MultisigMintRequest"},{"$ref":"#/components/schemas/SRC20MultisigTransferRequest"}]},"examples":{"mint":{"summary":"Mint example","value":{"network":"mainnet","toAddress":"bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2","changeAddress":"bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2","feeRate":20,"tick":"KEVIN","amt":"1000"}}}}}},"responses":{"200":{"description":"Unsigned multisig PSBT","content":{"application/json":{"schema":{"type":"object","properties":{"hex":{"type":"string","description":"Hex-encoded PSBT"},"base64":{"type":"string","description":"Base64-encoded PSBT"},"inputsToSign":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","description":"PSBT input index to sign"}}}},"est_tx_size":{"type":"integer","description":"Estimated transaction size in vbytes"},"est_miner_fee":{"type":"string","description":"Estimated miner fee in satoshis (stringified)"},"change_value":{"type":"string","description":"Change returned to changeAddress in satoshis (stringified)"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/trx/stampattach":{"post":{"operationId":"attachStampById","tags":["Stamps"],"summary":"Attach stamp by ID","description":"Creates a PSBT transaction to attach a stamp using its identifier (cpid, stamp number, or tx_hash).\nThe stamp will be attached to the specified address. Optionally, a specific UTXO can be specified using inputs_set.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address","identifier","quantity","options"],"properties":{"address":{"type":"string","description":"The Bitcoin address which owns the stamp","example":"bc1q20d2cdvy2x83h3ssrz5lgryy4c9wqxsgc749ej"},"identifier":{"type":"string","description":"The stamp identifier (cpid, stamp number, or tx_hash)","example":"11"},"quantity":{"type":"number","description":"The quantity of stamps to attach","example":1},"inputs_set":{"type":"string","description":"Specific UTXO to attach to (txid:vout format)","example":"10f8e495a5088dd90a731f4b2657bfb4e94b1f59d3961cbc960900d4e5ba44e5:0"},"options":{"type":"object","required":["satsPerVB"],"properties":{"satsPerVB":{"type":"number","description":"Fee rate in satoshis per virtual byte","example":20},"regular_dust_size":{"type":"number","description":"Override the dust amount for regular outputs (in satoshis)","default":333},"return_psbt":{"type":"boolean","description":"Return a PSBT instead of raw transaction","default":true},"verbose":{"type":"boolean","description":"Include additional transaction details","default":true}}}}}}}},"responses":{"200":{"description":"Successful response with PSBT transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/olga/mint":{"post":{"operationId":"mintStamp","tags":["Minting","Stamps"],"summary":"Mint a new stamp","description":"Creates a new stamp minting transaction that needs to be signed by the wallet","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintStampInputData"},"examples":{"mint":{"value":{"sourceWallet":"bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2","qty":1,"locked":true,"filename":"test.png","file":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAG1BMVEUAAAALOzcKBiAJTzz/1lqZoxgIaSyfQuJmIslgvM+QAAAAAXRSTlMAQObYZgAAAMlJREFUeNp9kNVhAzEMQFVtYE+ge8HfxhsUFkjuFih4gPJ3Jz9mMPuJJVvjzkR0CBJf7CFQB05GKs75EVCwEbAa+3Wg9XmZ5rOz7gljoE9ZmSydzT67lqcdaWrhUCo8m8baKDEt7Qqz4wtVKTVHRI8R2N1bW7wqMb4GLya0KQOYVOUrXfIaHKWY1lsCTfKXyih0msQXeA1td/RoHGOk++8figPKo67o+dqappTnx8FakD2Vxf11QA78F+cZ6cC5BCrd0F+T8UDmIwdjIhoVAu1hnQAAAABJRU5ErkJggg==","satsPerVB":20}}}}}},"responses":{"200":{"description":"Successful response with PSBT transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/olga/estimate":{"post":{"operationId":"estimateStampMintFee","tags":["Minting","Stamps"],"summary":"Estimate the cost of minting a stamp","description":"Estimates transaction size, miner fee, dust, and total cost for minting the given\nfile as a stamp, using dummy UTXOs instead of the caller's wallet. No transaction\nis built.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateRequest"}}}},"responses":{"200":{"description":"Fee estimate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/trx/stampdetach":{"post":{"operationId":"detachStampFromUtxo","tags":["Stamps","UTXO"],"summary":"Detach stamp from UTXO","description":"Creates a PSBT transaction to detach a stamp from a specific UTXO.\nIf no destination is provided, the stamp will be detached to the address corresponding to the UTXO.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["utxo"],"properties":{"utxo":{"type":"string","description":"The UTXO from which to detach the stamp","example":"10f8e495a5088dd90a731f4b2657bfb4e94b1f59d3961cbc960900d4e5ba44e5:0"},"destination":{"type":"string","description":"The address to detach the stamp to (optional)","example":"bc1qhhv6rmxvq5mj2fc3zne2gpjqduy45urapje64m"},"options":{"type":"object","properties":{"satsPerVB":{"type":"number","description":"Fee rate in satoshis per virtual byte","example":20},"regular_dust_size":{"type":"number","description":"Override the dust amount for regular outputs (in satoshis)"},"multisig_dust_size":{"type":"number","description":"Override the dust amount for multisig outputs (in satoshis)"},"return_psbt":{"type":"boolean","description":"Return a PSBT instead of raw transaction","default":true},"verbose":{"type":"boolean","description":"Include additional transaction details","default":true}}}}}}}},"responses":{"200":{"description":"Successful response with PSBT transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/trx/create_psbt":{"post":{"operationId":"createSellerPsbt","tags":["Stamps"],"summary":"Create a seller-side PSBT for a UTXO sale","description":"Builds a partially signed transaction offering the given UTXO for salePrice\nsatoshis payable to sellerAddress. The buyer completes it via /api/v2/trx/complete_psbt.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["utxo","salePrice","sellerAddress"],"properties":{"utxo":{"type":"string","description":"UTXO to sell in txid:vout format","example":"10f8e495a5088dd90a731f4b2657bfb4e94b1f59d3961cbc960900d4e5ba44e5:0"},"salePrice":{"type":"number","description":"Sale price in satoshis (must be > 0)","example":100000},"sellerAddress":{"type":"string","description":"Address that receives the sale proceeds"}}}}}},"responses":{"200":{"description":"Seller PSBT","content":{"application/json":{"schema":{"type":"object","required":["psbt"],"properties":{"psbt":{"type":"string","description":"Hex-encoded PSBT"},"fee":{"type":"number","description":"Fee in satoshis (currently a placeholder value)"},"inputCount":{"type":"integer"},"outputCount":{"type":"integer"},"estimatedSize":{"type":"integer","description":"Estimated size in bytes (currently a placeholder value)"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/trx/complete_psbt":{"post":{"operationId":"completeSellerPsbt","tags":["Stamps"],"summary":"Complete a seller PSBT with the buyer's funding input","description":"Adds the buyer's UTXO and change output to a seller PSBT produced by\n/api/v2/trx/create_psbt, at the requested fee rate.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sellerPsbtHex","buyerUtxo","buyerAddress","feeRate"],"properties":{"sellerPsbtHex":{"type":"string","description":"Hex-encoded seller PSBT"},"buyerUtxo":{"type":"string","description":"Buyer funding UTXO in txid:vout format"},"buyerAddress":{"type":"string","description":"Buyer address (receives change)"},"feeRate":{"type":"number","description":"Fee rate in satoshis per vbyte"}}}}}},"responses":{"200":{"description":"Completed PSBT","content":{"application/json":{"schema":{"type":"object","required":["completedPsbt"],"properties":{"completedPsbt":{"type":"string","description":"Hex-encoded completed PSBT"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/create/send":{"post":{"operationId":"createSendTransaction","tags":["Stamps"],"summary":"Build a Counterparty asset send PSBT","description":"Composes a Counterparty send of the given asset via the Counterparty API and\nreconstructs it as an unsigned PSBT for the wallet to sign. Fee precedence:\noptions.fee_per_kb, then satsPerVB, then the live mempool recommended rate.\nWith dryRun=true only the Counterparty-estimated fee is returned.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address","destination","asset","quantity"],"properties":{"address":{"type":"string","description":"Sender address (funds the transaction)"},"destination":{"type":"string","description":"Recipient address"},"asset":{"type":"string","description":"Counterparty asset name (cpid)"},"quantity":{"type":"number","description":"Quantity to send in the asset's base units (must be > 0)"},"satsPerVB":{"type":"number","description":"Fee rate in satoshis per vbyte"},"dryRun":{"type":"boolean","default":false,"description":"When true, return only the fee estimate without a PSBT"},"options":{"type":"object","properties":{"fee_per_kb":{"type":"number","description":"Explicit fee rate in satoshis per kilobyte (overrides satsPerVB)"},"encoding":{"type":"string","default":"opreturn","description":"Counterparty data encoding"},"memo":{"type":"string"},"memo_is_hex":{"type":"boolean"}}}}}}}},"responses":{"200":{"description":"Unsigned send PSBT, or fee estimate when dryRun=true","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"SendPsbt","properties":{"psbtHex":{"type":"string","description":"Hex-encoded unsigned PSBT"},"inputsToSign":{"type":"array","items":{"$ref":"#/components/schemas/InputToSign"}},"estimatedFee":{"type":"number","description":"Fee estimated by Counterparty in satoshis"}}},{"type":"object","title":"SendDryRun","properties":{"estimatedFee":{"type":"number","description":"Fee estimated by Counterparty in satoshis"}}}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/create/dispense":{"post":{"operationId":"createDispenseTransaction","tags":["Dispensers"],"summary":"Build a PSBT that buys from a dispenser","description":"Composes a Counterparty dispense (BTC payment to a dispenser) and reconstructs it\nas an unsigned PSBT for the buyer's wallet to sign, optionally splicing the\noperator service fee out of the change output. With dryRun=true a fixed-size\nnumeric fee estimate is returned instead. All handled failures, including\nCounterparty compose errors and malformed bodies, return 400.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address","dispenser","quantity","options"],"properties":{"address":{"type":"string","description":"Buyer address (funds the transaction and receives change)"},"dispenser":{"type":"string","description":"Dispenser address"},"quantity":{"type":"number","description":"BTC amount to pay to the dispenser, in satoshis"},"dryRun":{"type":"boolean","default":false,"description":"When true, return a numeric estimate without composing a PSBT"},"options":{"type":"object","description":"Fee and Counterparty compose options; satsPerVB or fee_per_kb is required unless dryRun=true","properties":{"satsPerVB":{"type":"number","description":"Fee rate in satoshis per vbyte"},"fee_per_kb":{"type":"number","description":"Fee rate in satoshis per kilobyte"},"allow_unconfirmed_inputs":{"type":"boolean","default":true},"validate":{"type":"boolean","default":true},"verbose":{"type":"boolean","default":true}}}}}}}},"responses":{"200":{"description":"Unsigned dispense PSBT, or fee estimate when dryRun=true","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"DispensePsbt","properties":{"psbt":{"type":"string","description":"Hex-encoded unsigned PSBT"},"inputsToSign":{"type":"array","items":{"$ref":"#/components/schemas/InputToSign"}},"estimatedFee":{"type":"number","description":"Total fee (Counterparty network fee plus service fee) in satoshis"},"estimatedVsize":{"type":"number","description":"Virtual size of the Counterparty-composed transaction"},"finalBuyerChange":{"type":"number","description":"Change returned to the buyer in satoshis (0 if dropped as dust)"}}},{"allOf":[{"$ref":"#/components/schemas/DryRunFeeEstimate"},{"type":"object","title":"DispenseDryRun","properties":{"dispenser_payment":{"type":"number","description":"Amount paid to the dispenser in satoshis"}}}]}]}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/api/v2/fairmint":{"get":{"operationId":"getFairminters","tags":["Minting"],"summary":"List all Counterparty fairminters","description":"Returns every fairminter known to the Counterparty API (all pages are fetched\nserver-side). The response is a bare array and can be large.\n","responses":{"200":{"description":"Fairminter list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Fairminter"}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/fairmint/compose":{"post":{"operationId":"composeFairmint","tags":["Minting"],"summary":"Build a fairmint PSBT","description":"Composes a Counterparty fairmint for the given asset and reconstructs it as an\nunsigned PSBT, optionally splicing a service fee out of the change output.\nquantity is required for paid fairminters and ignored for free ones. Any\nadditional body fields are forwarded to the Counterparty compose call. With\ndryRun=true a fixed-size numeric fee estimate is returned instead.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address","asset"],"properties":{"address":{"type":"string","description":"Minter address (funds the transaction and receives the minted asset)"},"asset":{"type":"string","description":"Fairminter asset name"},"quantity":{"type":"number","description":"Quantity to mint; required for paid fairminters, must be omitted for free ones"},"satsPerVB":{"type":"number","description":"Fee rate in satoshis per vbyte (satsPerVB or satsPerKB is required)"},"satsPerKB":{"type":"number","description":"Fee rate in satoshis per kilobyte"},"service_fee":{"type":"number","description":"Service fee in satoshis; defaults to the server-configured fee"},"service_fee_address":{"type":"string","description":"Service fee recipient; defaults to the server-configured address"},"dryRun":{"type":"boolean","default":false}}}}}},"responses":{"200":{"description":"Unsigned fairmint PSBT, or fee estimate when dryRun=true","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"FairmintPsbt","properties":{"psbtHex":{"type":"string","description":"Hex-encoded unsigned PSBT"},"inputsToSign":{"type":"array","items":{"$ref":"#/components/schemas/InputToSign"}},"estimatedFee":{"type":"number","description":"Total fee (Counterparty network fee plus service fee) in satoshis"},"estimatedVsize":{"type":"number","description":"Virtual size of the Counterparty-composed transaction"},"totalInputValue":{"type":"string","description":"Sum of the user's inputs in satoshis (stringified)"},"totalOutputValue":{"type":"string","description":"Sum of all outputs in satoshis (stringified)"},"finalUserChange":{"type":"string","description":"Change returned to the minter in satoshis (stringified, \"0\" if dropped as dust)"}}},{"$ref":"#/components/schemas/DryRunFeeEstimate"}]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/utxo/ancestors/{address}":{"get":{"operationId":"getUtxoAncestors","tags":["UTXO"],"summary":"Get unconfirmed ancestor data for an address's UTXOs","description":"Lists the mempool ancestor fee/size data for each spendable (non-stamp) UTXO of\nthe address that has unconfirmed ancestors. UTXOs without ancestors are omitted.\n","parameters":[{"in":"path","name":"address","required":true,"schema":{"type":"string"},"example":"bc1qhy8y5hajwqz56nzuqyqe9ghsvsxjkl3akmdrqp","description":"Bitcoin address"}],"responses":{"200":{"description":"Ancestor data per UTXO with unconfirmed ancestors","content":{"application/json":{"schema":{"type":"object","required":["ancestors"],"properties":{"ancestors":{"type":"array","items":{"type":"object","properties":{"fees":{"type":"number","description":"Total ancestor fees in satoshis"},"vsize":{"type":"number","description":"Total ancestor virtual size"},"weight":{"type":"number","description":"Total ancestor weight (vsize * 4)"}}}}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/keys":{"post":{"operationId":"createApiKey","tags":["API Keys"],"summary":"Register for a free API key","description":"Creates a new free-tier API key for the given email address.\nFree-tier keys receive 3-5x higher per-minute rate limits than anonymous\nrequests and a 50,000 request/day quota.\nRate-limited to 3 signup attempts per IP per hour.\n","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","description":"Email address to associate with the API key","example":"developer@example.com"}}}}}},"responses":{"201":{"description":"API key created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"api_key":{"type":"string","description":"The generated 64-character hex API key","example":"a1b2c3d4e5f6..."},"tier":{"type":"string","enum":["free"],"description":"Access tier for the key","example":"free"},"daily_limit":{"type":"integer","description":"Maximum requests per day for this tier","example":50000}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"409":{"description":"Conflict - Email already has an API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"An API key already exists for this email address.","code":"DUPLICATE_EMAIL"}}}},"429":{"description":"Too Many Requests - Signup rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"retryAfter":{"type":"integer"}}}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/api/v2/keys/usage":{"get":{"operationId":"getApiKeyUsage","tags":["API Keys"],"summary":"Get current API key usage stats","description":"Returns the authenticated key's tier, daily quota, today's usage count,\nand per-endpoint rate limit configuration.\nRequires `X-API-Key` header with a valid registered key.\n","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Usage statistics for the authenticated API key","content":{"application/json":{"schema":{"type":"object","properties":{"tier":{"type":"string","enum":["free","partner"],"example":"free"},"daily_limit":{"type":"integer","example":50000},"used_today":{"type":"integer","example":1234},"remaining":{"type":"integer","example":48766},"rate_limits":{"type":"object","description":"Per-endpoint rate limit configuration for this tier","properties":{"src20":{"type":"object","properties":{"requests_per_minute":{"oneOf":[{"type":"integer"},{"type":"string"}]},"requests_per_day":{"oneOf":[{"type":"integer"},{"type":"string"}]}}},"stamps":{"type":"object","properties":{"requests_per_minute":{"oneOf":[{"type":"integer"},{"type":"string"}]},"requests_per_day":{"oneOf":[{"type":"integer"},{"type":"string"}]}}},"blocks":{"type":"object","properties":{"requests_per_minute":{"oneOf":[{"type":"integer"},{"type":"string"}]},"requests_per_day":{"oneOf":[{"type":"integer"},{"type":"string"}]}}},"general":{"type":"object","properties":{"requests_per_minute":{"oneOf":[{"type":"integer"},{"type":"string"}]},"requests_per_day":{"oneOf":[{"type":"integer"},{"type":"string"}]}}}}}}}}}},"401":{"description":"Unauthorized - Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"X-API-Key header is required"}}}},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"tags":[{"name":"System","description":"System-level endpoints for health and version checks"},{"name":"Documentation","description":"API documentation endpoints"},{"name":"Balance","description":"STAMPS, SRC-101, and SRC-20 balance-related endpoints"},{"name":"Blocks","description":"Block-related endpoints"},{"name":"Collections","description":"Collection management endpoints"},{"name":"Cursed Stamps","description":"Endpoints for managing cursed stamps"},{"name":"SRC-20","description":"SRC-20 token related endpoints"},{"name":"SRC-101","description":"SRC-101 token related endpoints"},{"name":"Stamps","description":"Stamp management endpoints"},{"name":"Dispensers","description":"Dispenser management endpoints"},{"name":"Minting","description":"Token and stamp minting endpoints"},{"name":"UTXO","description":"UTXO management endpoints"},{"name":"API Keys","description":"API key signup and usage endpoints"}],"servers":[{"url":"https://stampchain.io","description":"Production server (uses live data)"},{"url":"https://dev.stampchain.io","description":"Production server (uses live data)"}]}