{"openapi":"3.0.0","paths":{"/api/v1/blockchain":{"get":{"description":"Get information about available blockchain endpoints","operationId":"BlockchainController_getServiceInfo","parameters":[],"responses":{"200":{"description":"Service information and available endpoints"}},"security":[{"bearer":[]}],"summary":"Blockchain Service Info","tags":["Blockchain"]}},"/api/v1/blockchain/tokens/deploy":{"post":{"description":"Deploys a unique ERC20 token contract for a company. Fee: $99 (0.01 MATIC on Polygon).","operationId":"BlockchainController_deployToken","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployTokenDto"}}}},"responses":{"201":{"description":"Token successfully deployed","content":{"application/json":{"schema":{"example":{"success":true,"data":{"contractId":"550e8400-e29b-41d4-a716-446655440000","contractAddress":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","chainId":80002,"transactionHash":"0x123abc...","explorerUrl":"https://amoy.polygonscan.com/address/0x742d35..."}}}}}},"400":{"description":"Invalid input data"},"500":{"description":"Deployment failed"}},"security":[{"bearer":[]}],"summary":"Deploy a new ERC20 token via factory","tags":["Blockchain"]}},"/api/v1/blockchain/nfts/deploy":{"post":{"description":"Deploys a unique ERC721 NFT collection with ERC2981 royalties. Fee: $149 (0.015 MATIC on Polygon).","operationId":"BlockchainController_deployNFT","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployNFTDto"}}}},"responses":{"201":{"description":"NFT collection successfully deployed","content":{"application/json":{"schema":{"example":{"success":true,"data":{"contractId":"550e8400-e29b-41d4-a716-446655440001","contractAddress":"0x853d955aCEf822Db058eb8505911ED77F175b99e","chainId":80002,"transactionHash":"0x456def...","explorerUrl":"https://amoy.polygonscan.com/address/0x853d95..."}}}}}},"400":{"description":"Invalid input data"},"500":{"description":"Deployment failed"}},"security":[{"bearer":[]}],"summary":"Deploy a new ERC721 NFT collection via factory","tags":["Blockchain"]}},"/api/v1/blockchain/contracts/info":{"get":{"description":"Retrieves on-chain and database information about a deployed contract.","operationId":"BlockchainController_getContractInfo","parameters":[{"name":"chainId","required":true,"in":"query","description":"Chain ID","schema":{"example":80002,"type":"number"}},{"name":"contractAddress","required":true,"in":"query","description":"Contract address","schema":{"example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","type":"string"}}],"responses":{"200":{"description":"Contract information retrieved","content":{"application/json":{"schema":{"example":{"success":true,"data":{"contractId":"550e8400-e29b-41d4-a716-446655440000","chainId":80002,"address":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","name":"Lakers Token","symbol":"LAL","type":"TOKEN","totalSupply":"1000000","owner":"0x123...","companyId":"company_2abc123","deployedAt":"2025-10-19T16:00:00Z","verified":false,"active":true,"explorerUrl":"https://amoy.polygonscan.com/address/0x742d35..."}}}}}},"404":{"description":"Contract not found"}},"security":[{"bearer":[]}],"summary":"Get contract information","tags":["Blockchain"]}},"/api/v1/tokens/{contractId}/mint":{"post":{"description":"Mints additional tokens to a recipient address. Only contract owner can mint.","operationId":"TokenMintController_mintToken","parameters":[{"name":"contractId","required":true,"in":"path","description":"Contract ID from database","schema":{"example":"550e8400-e29b-41d4-a716-446655440000","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintTokenDto"}}}},"responses":{"201":{"description":"Tokens minted successfully","content":{"application/json":{"schema":{"example":{"success":true,"data":{"transactionHash":"0x123abc...","amount":"1000000","recipient":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","blockNumber":12345,"contractAddress":"0x853d955aCEf822Db058eb8505911ED77F175b99e"}}}}}},"400":{"description":"Invalid input data"},"403":{"description":"Only contract owner can mint"},"404":{"description":"Contract not found"},"500":{"description":"Minting transaction failed"}},"security":[{"bearer":[]}],"summary":"Mint tokens to address","tags":["Token Minting"]}},"/api/v1/nfts/{contractId}/mint":{"post":{"description":"Mints a single NFT to a recipient address with metadata URI. Only contract owner/minter can mint.","operationId":"NFTMintController_mintNFT","parameters":[{"name":"contractId","required":true,"in":"path","description":"NFT Collection Contract ID from database","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintNFTDto"}}}},"responses":{"201":{"description":"NFT minted successfully","content":{"application/json":{"schema":{"example":{"success":true,"data":{"transactionHash":"0x456def...","tokenId":"1","recipient":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","tokenURI":"ipfs://QmXxxx.../1.json","blockNumber":12346,"contractAddress":"0x853d955aCEf822Db058eb8505911ED77F175b99e"}}}}}},"400":{"description":"Invalid input data"},"403":{"description":"Only contract owner/minter can mint"},"404":{"description":"Contract not found"},"500":{"description":"Minting transaction failed"}},"security":[{"bearer":[]}],"summary":"Mint single NFT to address","tags":["NFT Minting"]}},"/api/v1/nfts/{contractId}/mint/batch":{"post":{"description":"Mints multiple NFTs to a recipient address. Only contract owner/minter can mint.","operationId":"NFTMintController_batchMintNFT","parameters":[{"name":"contractId","required":true,"in":"path","description":"NFT Collection Contract ID from database","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchMintNFTDto"}}}},"responses":{"201":{"description":"NFTs batch minted successfully","content":{"application/json":{"schema":{"example":{"success":true,"data":{"transactionHash":"0x789ghi...","tokenIds":["1","2","3","4","5","6","7","8","9","10"],"quantity":10,"recipient":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","blockNumber":12347,"contractAddress":"0x853d955aCEf822Db058eb8505911ED77F175b99e"}}}}}},"400":{"description":"Invalid input data"},"403":{"description":"Only contract owner/minter can mint"},"404":{"description":"Contract not found"},"500":{"description":"Batch minting transaction failed"}},"security":[{"bearer":[]}],"summary":"Batch mint multiple NFTs","tags":["NFT Minting"]}},"/api/v1/companies/{companyId}/transactions":{"get":{"description":"Retrieves paginated list of blockchain transactions for a company with optional filters","operationId":"TransactionHistoryController_getCompanyTransactions","parameters":[{"name":"companyId","required":true,"in":"path","description":"Company ID","schema":{"example":"company_2abc123","type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain ID","schema":{"example":137,"type":"number"}},{"name":"type","required":false,"in":"query","description":"Filter by transaction type","schema":{"example":"MINT","type":"string","enum":["DEPLOY","MINT","TRANSFER","BURN","APPROVE","OTHER"]}},{"name":"status","required":false,"in":"query","description":"Filter by transaction status","schema":{"example":"CONFIRMED","type":"string","enum":["PENDING","CONFIRMED","FAILED"]}},{"name":"startDate","required":false,"in":"query","description":"Start date for filtering (ISO 8601 format)","schema":{"example":"2025-10-01T00:00:00Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date for filtering (ISO 8601 format)","schema":{"example":"2025-10-31T23:59:59Z","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}}],"responses":{"200":{"description":"Transaction history retrieved successfully","schema":{"example":{"transactions":[{"id":"tx_550e8400","chainId":137,"txHash":"0x123abc...","type":"MINT","status":"CONFIRMED","blockNumber":12345678,"gasUsed":"21000","gasPriceGwei":"30.500000000","fromAddress":"0x123...","toAddress":"0x456...","value":null,"data":{"amount":"100"},"error":null,"createdAt":"2025-10-23T10:00:00Z","confirmedAt":"2025-10-23T10:01:00Z"}],"pagination":{"page":1,"pageSize":20,"totalCount":100,"totalPages":5}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCompanyTransactionsResponseDto"}}}},"400":{"description":"Invalid query parameters"},"404":{"description":"Company not found"}},"security":[{"bearer":[]}],"summary":"Get company transaction history","tags":["Transaction History"]}},"/api/v1/companies/{companyId}/transactions/stats":{"get":{"description":"Retrieves aggregated statistics of blockchain transactions for a company","operationId":"TransactionHistoryController_getCompanyTransactionStats","parameters":[{"name":"companyId","required":true,"in":"path","description":"Company ID","schema":{"example":"company_2abc123","type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date for filtering (ISO 8601 format)","schema":{"example":"2025-10-01T00:00:00Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date for filtering (ISO 8601 format)","schema":{"example":"2025-10-31T23:59:59Z","type":"string"}}],"responses":{"200":{"description":"Transaction statistics retrieved successfully","schema":{"example":{"companyId":"company_2abc123","dateRange":{"startDate":"2025-10-01T00:00:00Z","endDate":"2025-10-31T23:59:59Z"},"totalTransactions":15,"gasMetrics":{"totalGasUsedWei":"315000","totalGasCostWei":"9450000000000000","totalGasCostEther":"0.009450000","averageGasCostPerTransaction":"0.000630000"},"breakdowns":{"byType":{"DEPLOY":2,"MINT":10,"TRANSFER":3},"byStatus":{"CONFIRMED":14,"FAILED":1},"byChain":[{"chainId":137,"chainName":"Polygon Mainnet","transactionCount":10,"totalGasCost":"0.006300000"},{"chainId":80002,"chainName":"Polygon Amoy Testnet","transactionCount":5,"totalGasCost":"0.003150000"}]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionStatsResponseDto"}}}},"400":{"description":"Invalid query parameters"},"404":{"description":"Company not found"}},"security":[{"bearer":[]}],"summary":"Get transaction statistics","tags":["Transaction History"]}},"/api/v1/nfts/{id}":{"get":{"description":"Retrieves a single NFT by its ID with all metadata and ownership information.","operationId":"NFTRetrievalController_getNFTById","parameters":[{"name":"id","required":true,"in":"path","description":"NFT ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"responses":{"200":{"description":"NFT retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NFTResponseDto"}}}},"404":{"description":"NFT not found"}},"security":[{"bearer":[]}],"summary":"Get NFT by ID","tags":["NFT Retrieval"]}},"/api/v1/nfts/collection/{collectionId}":{"get":{"description":"Retrieves all NFTs in a specific collection with pagination.","operationId":"NFTRetrievalController_getNFTsByCollection","parameters":[{"name":"collectionId","required":true,"in":"path","description":"NFT Collection ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440004","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"NFTs retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NFTListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get NFTs by collection","tags":["NFT Retrieval"]}},"/api/v1/nfts/owner/{ownerId}":{"get":{"description":"Retrieves all NFTs owned by a specific user with pagination.","operationId":"NFTRetrievalController_getNFTsByOwner","parameters":[{"name":"ownerId","required":true,"in":"path","description":"Owner Clerk user ID","schema":{"example":"user_2abc123def456","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"NFTs retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NFTListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get NFTs by owner","tags":["NFT Retrieval"]}},"/api/v1/nfts/campaign/{campaignId}":{"get":{"description":"Retrieves all NFTs associated with a specific campaign.","operationId":"NFTRetrievalController_getNFTsByCampaign","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440003","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"NFTs retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NFTListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get NFTs by campaign","tags":["NFT Retrieval"]}},"/api/v1/nfts/company/{companyId}":{"get":{"description":"Retrieves all NFTs created by a specific company with pagination.","operationId":"NFTRetrievalController_getNFTsByCompany","parameters":[{"name":"companyId","required":true,"in":"path","description":"Company ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440002","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"NFTs retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NFTListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get NFTs by company","tags":["NFT Retrieval"]}},"/api/v1/tokens/me":{"get":{"description":"Returns individual tokens owned by the authenticated user. Each token includes its actual ID needed for marketplace operations (list/transfer).","operationId":"TokenController_getMyTokens","parameters":[{"name":"limit","required":false,"in":"query","description":"Max tokens to return (default: 100)","schema":{"type":"number"}}],"responses":{"200":{"description":"User tokens retrieved successfully"},"401":{"description":"Unauthorized - Invalid or missing authentication token"}},"security":[{"bearer":[]}],"summary":"Get my tokens","tags":["Tokens"]}},"/api/v1/tokens/{id}":{"get":{"description":"Retrieves a single token by its ID with all metadata including image URL.","operationId":"TokenController_getTokenById","parameters":[{"name":"id","required":true,"in":"path","description":"Token ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"responses":{"200":{"description":"Token retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponseDto"}}}},"404":{"description":"Token not found"}},"security":[{"bearer":[]}],"summary":"Get token by ID","tags":["Tokens"]}},"/api/v1/tokens/{id}/analytics":{"get":{"description":"Retrieves comprehensive analytics for a token including supply metrics, holder statistics, price data, transaction counts, and blockchain information. This endpoint aggregates data from multiple sources to provide a complete view of token performance.","operationId":"TokenController_getTokenAnalytics","parameters":[{"name":"id","required":true,"in":"path","description":"Token ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"responses":{"200":{"description":"Token analytics retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenAnalyticsResponseDto"}}}},"404":{"description":"Token not found"}},"security":[{"bearer":[]}],"summary":"Get token analytics","tags":["Tokens"]}},"/api/v1/tokens/{id}/holders":{"get":{"description":"Retrieves a list of all holders for a specific token, including their wallet addresses, token balances, percentage of supply, custody type, and activity timestamps. Supports pagination for large holder lists.","operationId":"TokenController_getTokenHolders","parameters":[{"name":"id","required":true,"in":"path","description":"Token ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"Token holders retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenHoldersResponseDto"}}}},"404":{"description":"Token not found"}},"security":[{"bearer":[]}],"summary":"Get token holders","tags":["Tokens"]}},"/api/v1/tokens/pxl8l/multichain-stats":{"get":{"description":"Retrieves comprehensive PXL8L token statistics aggregated across all deployed chains. Includes price data per chain, arbitrage opportunities, and recommendations for which chain offers the best price to buy from (factoring in gas fees). Perfect for the dashboard to display PXL8L analytics and help users make informed buying decisions.","operationId":"TokenController_getPXL8LMultiChainStats","parameters":[],"responses":{"200":{"description":"PXL8L multi-chain statistics retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PXL8LMultiChainStatsResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get PXL8L multi-chain statistics","tags":["Tokens"]}},"/api/v1/tokens/campaign/{campaignId}":{"get":{"description":"Retrieves all tokens associated with a specific campaign.","operationId":"TokenController_getTokensByCampaign","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440003","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"Tokens retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get tokens by campaign","tags":["Tokens"]}},"/api/v1/tokens/internal/owner/{ownerId}":{"get":{"description":"Internal endpoint for service-to-service calls. Retrieves all tokens owned by a specific user.","operationId":"TokenController_getTokensByOwner","parameters":[{"name":"ownerId","required":true,"in":"path","description":"Owner Clerk user ID (internal use only)","schema":{"example":"user_2abc123def456","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"X-Internal-Api-Key","in":"header","description":"Internal service API key","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tokens retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenListResponseDto"}}}},"401":{"description":"Internal API key required"}},"security":[{"bearer":[]}],"summary":"[INTERNAL] Get tokens by owner","tags":["Tokens"]}},"/api/v1/tokens/company/{companyId}":{"get":{"description":"Retrieves all tokens created by a specific company.","operationId":"TokenController_getTokensByCompany","parameters":[{"name":"companyId","required":true,"in":"path","description":"Company ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440002","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"Tokens retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get tokens by company","tags":["Tokens"]}},"/api/v1/tokens/{id}/image":{"post":{"description":"Uploads an image for a token to DO Spaces CDN and updates token metadata.","operationId":"TokenController_uploadTokenImage","parameters":[{"name":"id","required":true,"in":"path","description":"Token ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"requestBody":{"required":true,"description":"Image file to upload","content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Image uploaded successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadTokenImageResponseDto"}}}},"400":{"description":"Invalid file type"},"404":{"description":"Token not found"}},"security":[{"bearer":[]}],"summary":"Upload token image","tags":["Tokens"]}},"/api/v1/tokens/{tokenId}/details":{"get":{"description":"Retrieves complete information about a specific token including campaign details, ownership information, purchase history, blockchain data, DeFi integration (if applicable), pricing, benefits, and certificate availability. This endpoint requires authentication and only the token owner can view full details.","operationId":"TokensController_getTokenDetails","parameters":[{"name":"tokenId","required":true,"in":"path","description":"Token UUID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"responses":{"200":{"description":"Token details retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenDetailsResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication token"},"403":{"description":"Forbidden - You do not have permission to view this token"},"404":{"description":"Token not found"}},"security":[{"bearer":[]}],"summary":"Get comprehensive token details","tags":["Tokens"]}},"/api/v1/tokens/owner/{userId}":{"get":{"description":"Returns all tokens owned by a user, grouped by campaign/asset. Used by customers service to display portfolio holdings.","operationId":"TokensController_getTokensByOwner","parameters":[{"name":"userId","required":true,"in":"path","description":"Clerk user ID","schema":{"example":"user_abc123","type":"string"}}],"responses":{"200":{"description":"User token holdings retrieved successfully"}},"summary":"Get tokens owned by user (internal API)","tags":["Tokens"]}},"/api/v1/price-history/track":{"post":{"description":"Records a new price data point for a token from a DEX or price feed.","operationId":"PriceHistoryController_trackPrice","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackPriceDto"}}}},"responses":{"201":{"description":"Price tracked successfully"},"400":{"description":"Invalid input data"}},"security":[{"bearer":[]}],"summary":"Track token price","tags":["Token Price History"]}},"/api/v1/price-history/{contractAddress}/chain/{chainId}":{"get":{"description":"Retrieves historical price data for a token with optional date filtering.","operationId":"PriceHistoryController_getPriceHistory","parameters":[{"name":"contractAddress","required":true,"in":"path","description":"Token contract address","schema":{"example":"0x853d955aCEf822Db058eb8505911ED77F175b99e","type":"string"}},{"name":"chainId","required":true,"in":"path","description":"Chain ID","schema":{"example":137,"type":"string"}},{"name":"startDate","required":false,"in":"query","description":"Start date for price history (ISO 8601)","schema":{"example":"2025-01-01T00:00:00Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date for price history (ISO 8601)","schema":{"example":"2025-01-31T23:59:59Z","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of records to return","schema":{"minimum":1,"maximum":1000,"default":100,"example":100,"type":"number"}}],"responses":{"200":{"description":"Price history retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PriceHistoryResponseDto"}}}}}},"security":[{"bearer":[]}],"summary":"Get price history for token","tags":["Token Price History"]}},"/api/v1/price-history/{contractAddress}/chain/{chainId}/latest":{"get":{"description":"Retrieves the most recent price data point for a token.","operationId":"PriceHistoryController_getLatestPrice","parameters":[{"name":"contractAddress","required":true,"in":"path","description":"Token contract address","schema":{"example":"0x853d955aCEf822Db058eb8505911ED77F175b99e","type":"string"}},{"name":"chainId","required":true,"in":"path","description":"Chain ID","schema":{"example":137,"type":"string"}}],"responses":{"200":{"description":"Latest price retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceHistoryResponseDto"}}}},"404":{"description":"No price data found"}},"security":[{"bearer":[]}],"summary":"Get latest price for token","tags":["Token Price History"]}},"/api/v1/price-history/{contractAddress}/chain/{chainId}/stats24h":{"get":{"description":"Retrieves 24-hour price statistics including current price, change, high, low, and volume.","operationId":"PriceHistoryController_get24hStats","parameters":[{"name":"contractAddress","required":true,"in":"path","description":"Token contract address","schema":{"example":"0x853d955aCEf822Db058eb8505911ED77F175b99e","type":"string"}},{"name":"chainId","required":true,"in":"path","description":"Chain ID","schema":{"example":137,"type":"string"}}],"responses":{"200":{"description":"24h stats retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenStats24hDto"}}}}},"security":[{"bearer":[]}],"summary":"Get 24h statistics for token","tags":["Token Price History"]}},"/api/v1/activity/company/{companyId}":{"get":{"description":"Retrieves all blockchain transactions for a company with filtering and pagination.","operationId":"ActivityController_getActivityByCompany","parameters":[{"name":"companyId","required":true,"in":"path","description":"Company ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440002","type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain ID","schema":{"example":137,"type":"number"}},{"name":"type","required":false,"in":"query","description":"Filter by transaction type","schema":{"example":"MINT","type":"string","enum":["DEPLOY","MINT","TRANSFER","BURN","APPROVE","OTHER"]}},{"name":"status","required":false,"in":"query","description":"Filter by transaction status","schema":{"example":"CONFIRMED","type":"string","enum":["PENDING","CONFIRMED","FAILED"]}},{"name":"startDate","required":false,"in":"query","description":"Start date for filtering (ISO 8601)","schema":{"example":"2025-01-01T00:00:00Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"End date for filtering (ISO 8601)","schema":{"example":"2025-01-31T23:59:59Z","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"Activity retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get activity by company","tags":["Activity Tracking"]}},"/api/v1/activity/contract/{contractId}":{"get":{"description":"Retrieves all blockchain transactions for a specific contract.","operationId":"ActivityController_getActivityByContract","parameters":[{"name":"contractId","required":true,"in":"path","description":"Contract ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"responses":{"200":{"description":"Activity retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get activity by contract","tags":["Activity Tracking"]}},"/api/v1/activity/stats/company/{companyId}":{"get":{"description":"Retrieves aggregated statistics for all blockchain transactions of a company.","operationId":"ActivityController_getActivityStats","parameters":[{"name":"companyId","required":true,"in":"path","description":"Company ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440002","type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Statistics retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityStatsResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get activity statistics for company","tags":["Activity Tracking"]}},"/api/v1/activity/transaction/{chainId}/{txHash}":{"get":{"description":"Retrieves a specific blockchain transaction by its hash and chain ID.","operationId":"ActivityController_getTransactionByHash","parameters":[{"name":"chainId","required":true,"in":"path","description":"Chain ID","schema":{"example":137,"type":"string"}},{"name":"txHash","required":true,"in":"path","description":"Transaction hash","schema":{"example":"0x456def...","type":"string"}}],"responses":{"200":{"description":"Transaction retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponseDto"}}}},"404":{"description":"Transaction not found"}},"security":[{"bearer":[]}],"summary":"Get transaction by hash","tags":["Activity Tracking"]}},"/api/v1/campaigns/{campaignId}/statistics":{"get":{"description":"Retrieves detailed statistics for a campaign including supply, holders, financial metrics, and custody information.","operationId":"CampaignStatisticsController_getCampaignStatistics","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign ID","schema":{"example":"41","type":"string"}}],"responses":{"200":{"description":"Campaign statistics retrieved successfully"},"404":{"description":"Campaign not found"}},"security":[{"bearer":[]}],"summary":"Get campaign statistics","tags":["Campaign Statistics"]}},"/api/v1/campaigns/{campaignId}/wallet":{"get":{"description":"Retrieves the company custodial wallet address for a campaign along with custody breakdown.","operationId":"CampaignStatisticsController_getCampaignWallet","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign ID","schema":{"example":"41","type":"string"}}],"responses":{"200":{"description":"Campaign wallet information retrieved successfully"},"404":{"description":"Campaign not found"}},"security":[{"bearer":[]}],"summary":"Get campaign custodial wallet","tags":["Campaign Statistics"]}},"/api/v1/tokens/bridge/balance":{"get":{"description":"Retrieves user token balance separated by custody type (custodial vs self-custodial).","operationId":"TokenBridgeController_getBalance","parameters":[{"name":"x-user-id","required":true,"in":"header","description":"User ID (Clerk user ID)","schema":{"type":"string"}}],"responses":{"200":{"description":"Balance retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenBalanceDto"}}}},"401":{"description":"Unauthorized - missing or invalid authentication"}},"security":[{"bearer":[]}],"summary":"Get token balance","tags":["Token Bridge"]}},"/api/v1/tokens/bridge/{id}/withdraw":{"post":{"description":"Transfers a custodial token to user's self-custodial wallet. Token must be owned by user and in custodial state.","operationId":"TokenBridgeController_withdrawToken","parameters":[{"name":"id","required":true,"in":"path","description":"Token ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}},{"name":"x-user-id","required":true,"in":"header","description":"User ID (Clerk user ID)","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawTokenDto"}}}},"responses":{"200":{"description":"Withdrawal initiated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawalResultDto"}}}},"400":{"description":"Bad request - invalid token state or destination wallet"},"403":{"description":"Forbidden - user does not own the token"},"404":{"description":"Token not found"}},"security":[{"bearer":[]}],"summary":"Withdraw token to wallet","tags":["Token Bridge"]}},"/api/v1/tokens/bridge/{id}/withdrawal-status":{"get":{"description":"Check the status of a token withdrawal transaction.","operationId":"TokenBridgeController_getWithdrawalStatus","parameters":[{"name":"id","required":true,"in":"path","description":"Token ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}},{"name":"x-user-id","required":true,"in":"header","description":"User ID (Clerk user ID)","schema":{"type":"string"}}],"responses":{"200":{"description":"Status retrieved successfully"},"404":{"description":"Token not found"}},"security":[{"bearer":[]}],"summary":"Get withdrawal status","tags":["Token Bridge"]}},"/api/v1/public/campaigns":{"get":{"description":"Returns enriched campaign data for Atlas AI to present to customers","operationId":"PublicCampaignsController_getPublicCampaigns","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by campaign status","schema":{"example":"ACTIVE","type":"string"}},{"name":"assetType","required":false,"in":"query","description":"Filter by asset type","schema":{"enum":["SECURITY","UTILITY","DEFI"],"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by blockchain chain ID","schema":{"example":"8453","type":"string"}}],"responses":{"200":{"description":"List of campaigns with enriched data"}},"summary":"Get all available campaigns for purchase (Atlas AI)","tags":["Public Campaigns (Atlas AI)"]}},"/api/v1/public/campaigns/{id}":{"get":{"description":"Returns detailed campaign information including benefits and tokenomics","operationId":"PublicCampaignsController_getCampaignById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Campaign details"},"404":{"description":"Campaign not found"}},"summary":"Get campaign details by ID (Atlas AI)","tags":["Public Campaigns (Atlas AI)"]}},"/api/v1/campaigns":{"get":{"description":"Platform admins see all campaigns. Company users see only campaigns from their company.","operationId":"CampaignsController_listCampaigns","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of campaigns"}},"summary":"List all campaigns","tags":["Campaigns"]},"post":{"description":"Create a new campaign for utility or fractional ownership tokens","operationId":"CampaignsController_createCampaign","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignDto"}}}},"responses":{"201":{"description":"Campaign created successfully"},"400":{"description":"Invalid input"}},"summary":"Create a new token issuance campaign","tags":["Campaigns"]}},"/api/v1/campaigns/{id}":{"get":{"description":"Get detailed information about a specific campaign","operationId":"CampaignsController_getCampaign","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Campaign details"},"404":{"description":"Campaign not found"}},"summary":"Get campaign details","tags":["Campaigns"]},"put":{"description":"Update campaign details using PUT","operationId":"CampaignsController_updateCampaign","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignDto"}}}},"responses":{"200":{"description":"Campaign updated successfully"},"404":{"description":"Campaign not found"}},"summary":"Update a campaign (full update)","tags":["Campaigns"]},"patch":{"description":"Partial update campaign details using PATCH","operationId":"CampaignsController_patchCampaign","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCampaignDto"}}}},"responses":{"200":{"description":"Campaign updated successfully"},"404":{"description":"Campaign not found"}},"summary":"Update a campaign (partial update)","tags":["Campaigns"]},"delete":{"description":"Soft delete a campaign (sets deletedAt timestamp)","operationId":"CampaignsController_deleteCampaign","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Campaign deleted successfully"},"404":{"description":"Campaign not found"}},"summary":"Delete a campaign","tags":["Campaigns"]}},"/api/v1/campaigns/pass":{"post":{"description":"\n      Simplified campaign creation for athletes.\n      Automatically uses companyId from authenticated user.\n      Auto-fills sensible defaults for chain, supply, etc.\n\n      Requires authentication - companyId is extracted from JWT.\n    ","operationId":"CampaignsController_createPASS","parameters":[{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePASSDto"}}}},"responses":{"201":{"description":"PASS created successfully"},"400":{"description":"Invalid input or missing benefits"},"401":{"description":"Not authenticated"}},"summary":"Create a PASS (simplified for athletes)","tags":["Campaigns"]}},"/api/v1/campaigns/{id}/status":{"post":{"description":"Update campaign status (DRAFT, ACTIVE, PAUSED, etc.)","operationId":"CampaignsController_changeStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Status updated successfully"},"400":{"description":"Invalid status or missing requirements"}},"summary":"Change campaign status","tags":["Campaigns"]}},"/api/v1/campaigns/{id}/marketplace-listing":{"post":{"description":"Control whether campaign appears in marketplace","operationId":"CampaignsController_toggleMarketplaceListing","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Marketplace listing toggled"}},"summary":"Toggle marketplace listing","tags":["Campaigns"]}},"/api/v1/campaigns/{id}/deploy":{"post":{"description":"Deploy an ERC20 token contract for the campaign on the specified blockchain","operationId":"CampaignsController_deployCampaignContract","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Contract deployed successfully"},"400":{"description":"Invalid input or campaign not in DRAFT status"},"404":{"description":"Campaign not found"}},"summary":"Deploy smart contract for campaign","tags":["Campaigns"]}},"/api/v1/campaigns/{id}/image":{"post":{"description":"Uploads an image for a campaign to CDN and updates campaign metadata.","operationId":"CampaignsController_uploadCampaignImage","parameters":[{"name":"id","required":true,"in":"path","description":"Campaign ID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"requestBody":{"required":true,"description":"Image file to upload","content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Image uploaded successfully"},"400":{"description":"Invalid file type"},"404":{"description":"Campaign not found"}},"summary":"Upload campaign image","tags":["Campaigns"]}},"/api/v1/purchases/intent":{"post":{"operationId":"PurchasesController_createPurchaseIntent","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseIntentDto"}}}},"responses":{"201":{"description":"Purchase intent created"}},"security":[{"bearer":[]}],"summary":"Create purchase intent (Atlas AI)","tags":["Purchases"]}},"/api/v1/purchases/{intentId}":{"get":{"operationId":"PurchasesController_getPurchaseIntent","parameters":[{"name":"intentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get purchase intent by ID (Atlas AI)","tags":["Purchases"]}},"/api/v1/purchases/complete":{"post":{"operationId":"PurchasesController_completePurchase","parameters":[],"responses":{"200":{"description":"Purchase completed, tokens minted"},"400":{"description":"stripePaymentIntentId is required"}},"summary":"Complete purchase after payment (Internal - called by payments webhook or mobile app)","tags":["Purchases"]}},"/api/v1/protocol-fees/calculate":{"get":{"description":"Calculate the protocol fee for a given asset value. Returns fee in USD and PXL8L.","operationId":"ProtocolFeeController_calculateFee","parameters":[{"name":"assetValueUsd","required":true,"in":"query","description":"Asset value in USD","schema":{"type":"number"}}],"responses":{"200":{"description":"Fee calculation result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeCalculationResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Calculate protocol fee","tags":["Protocol Fees"]}},"/api/v1/protocol-fees/check-approval":{"get":{"description":"Check if the company wallet has approved the platform to spend their PXL8L tokens for protocol fees.","operationId":"ProtocolFeeController_checkApproval","parameters":[{"name":"wallet","required":true,"in":"query","description":"Company wallet address","schema":{"type":"string"}},{"name":"chainId","required":true,"in":"query","description":"Chain ID","schema":{"type":"number"}},{"name":"assetValueUsd","required":true,"in":"query","description":"Asset value in USD","schema":{"type":"number"}}],"responses":{"200":{"description":"Approval status and required info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalStatusResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Check if company has approved platform for PXL8L spending","tags":["Protocol Fees"]}},"/api/v1/protocol-fees/spender-address":{"get":{"description":"Get the platform address that needs approval to spend PXL8L tokens.","operationId":"ProtocolFeeController_getSpenderAddress","parameters":[],"responses":{"200":{"description":"Platform spender address"}},"security":[{"bearer":[]}],"summary":"Get platform spender address","tags":["Protocol Fees"]}},"/api/v1/protocol-fees/token-address":{"get":{"description":"Get the PXL8L token contract address for a specific chain.","operationId":"ProtocolFeeController_getTokenAddress","parameters":[{"name":"chainId","required":true,"in":"query","description":"Chain ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Token address"}},"security":[{"bearer":[]}],"summary":"Get PXL8L token address for a chain","tags":["Protocol Fees"]}},"/api/v1/protocol-fees/collect":{"post":{"description":"Collect protocol fee from company wallet to treasury. Requires prior approval.","operationId":"ProtocolFeeController_collectFee","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectFeeRequestDto"}}}},"responses":{"200":{"description":"Fee collection result"},"400":{"description":"Insufficient allowance or invalid parameters"}},"security":[{"bearer":[]}],"summary":"Collect protocol fee","tags":["Protocol Fees"]}},"/api/v1/marketplace/listings":{"post":{"operationId":"MarketplaceController_createListing","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateListingDto"}}}},"responses":{"201":{"description":"Listing created"},"400":{"description":"Token not available for sale"},"403":{"description":"You do not own this token"}},"security":[{"bearer":[]}],"summary":"Create a listing to sell a token","tags":["Marketplace"]},"get":{"operationId":"MarketplaceController_browseListings","parameters":[{"name":"companyId","required":false,"in":"query","description":"Filter by company ID","schema":{"type":"string"}},{"name":"campaignId","required":false,"in":"query","description":"Filter by campaign ID","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Limit results","schema":{"default":50,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Offset for pagination","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":"List of active listings"}},"summary":"Browse active marketplace listings","tags":["Marketplace"]}},"/api/v1/marketplace/listings/{id}":{"get":{"operationId":"MarketplaceController_getListing","parameters":[{"name":"id","required":true,"in":"path","description":"Listing ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Listing details"},"404":{"description":"Listing not found"}},"summary":"Get a specific listing","tags":["Marketplace"]},"delete":{"operationId":"MarketplaceController_cancelListing","parameters":[{"name":"id","required":true,"in":"path","description":"Listing ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Listing cancelled"},"403":{"description":"You do not own this listing"},"404":{"description":"Listing not found"}},"security":[{"bearer":[]}],"summary":"Cancel a listing","tags":["Marketplace"]}},"/api/v1/marketplace/listings/{id}/purchase":{"post":{"operationId":"MarketplaceController_initiatePurchase","parameters":[{"name":"id","required":true,"in":"path","description":"Listing ID","schema":{"type":"string"}}],"responses":{"201":{"description":"Purchase initiated, payment intent created"},"400":{"description":"Listing not available"}},"security":[{"bearer":[]}],"summary":"Initiate purchase of a listing (returns Stripe payment intent)","tags":["Marketplace"]}},"/api/v1/marketplace/purchases/complete":{"post":{"operationId":"MarketplaceController_completePurchase","parameters":[{"name":"X-Internal-Api-Key","in":"header","description":"Internal service API key","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Purchase completed"},"401":{"description":"Internal API key required"}},"summary":"Complete a marketplace purchase (called by webhook)","tags":["Marketplace"]}},"/api/v1/marketplace/transfers":{"post":{"operationId":"MarketplaceController_initiateTransfer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferTokenDto"}}}},"responses":{"201":{"description":"Transfer initiated, fee payment required"},"400":{"description":"Token not transferable or validation failed"},"403":{"description":"You do not own this token"},"404":{"description":"Recipient not found"}},"security":[{"bearer":[]}],"summary":"Initiate a P2P token transfer (supports single or batch, returns Stripe payment intent for fee)","tags":["Marketplace"]}},"/api/v1/marketplace/transfers/complete":{"post":{"operationId":"MarketplaceController_completeTransfer","parameters":[{"name":"X-Internal-Api-Key","in":"header","description":"Internal service API key","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Transfer completed"},"401":{"description":"Internal API key required"}},"summary":"Complete a token transfer (called by webhook)","tags":["Marketplace"]}},"/api/v1/marketplace/tokens/{tokenId}/scarcity-price":{"get":{"operationId":"MarketplaceController_getScarcityPrice","parameters":[{"name":"tokenId","required":true,"in":"path","description":"Token ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Scarcity pricing details"}},"summary":"Get suggested resale price based on scarcity","tags":["Marketplace"]}},"/api/v1/marketplace/my/listings":{"get":{"operationId":"MarketplaceController_getMyListings","parameters":[],"responses":{"200":{"description":"Your listings"}},"security":[{"bearer":[]}],"summary":"Get your listings","tags":["Marketplace"]}},"/api/v1/marketplace/my/transfers":{"get":{"operationId":"MarketplaceController_getMyTransfers","parameters":[],"responses":{"200":{"description":"Your transfers"}},"security":[{"bearer":[]}],"summary":"Get your transfer history","tags":["Marketplace"]}},"/api/v1/public/tokens/{tokenId}":{"get":{"description":"Returns token details for public QR code page. No authentication required.","operationId":"PublicTokenController_getPublicToken","parameters":[{"name":"tokenId","required":true,"in":"path","description":"Token UUID","schema":{"example":"550e8400-e29b-41d4-a716-446655440001","type":"string"}}],"responses":{"200":{"description":"Token details with benefits and redemption status"},"404":{"description":"Token not found"}},"summary":"Get public token page data","tags":["Public Token (QR Code)"]}},"/api/v1/public/tokens/{tokenId}/benefits/{benefitId}/redeem":{"post":{"description":"Marks a benefit as redeemed. Called from public QR page. No authentication required.","operationId":"PublicTokenController_redeemBenefit","parameters":[{"name":"tokenId","required":true,"in":"path","description":"Token UUID","schema":{"type":"string"}},{"name":"benefitId","required":true,"in":"path","description":"Benefit UUID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"locationName":{"type":"string","description":"Optional event/venue name"}}}}}},"responses":{"200":{"description":"Benefit redeemed successfully"},"400":{"description":"Benefit already redeemed or not found"},"404":{"description":"Token not found"}},"summary":"Redeem a token benefit","tags":["Public Token (QR Code)"]}},"/api/v1/governance/proposals":{"post":{"description":"Create a proposal for token holders to vote on. Set campaignId for token-level (only those token holders) or omit for company-level (all token holders).","operationId":"GovernanceController_createProposal","parameters":[{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProposalDto"}}}},"responses":{"201":{"description":"Proposal created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalResponseDto"}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"}},"summary":"Create a new proposal","tags":["Governance"]},"get":{"operationId":"GovernanceController_getCompanyProposals","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"type":"string","enum":["DRAFT","ACTIVE","CLOSED","EXECUTED","CANCELLED"]}},{"name":"limit","required":false,"in":"query","description":"Limit results","schema":{"default":50,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Offset for pagination","schema":{"default":0,"type":"number"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of proposals","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProposalResponseDto"}}}}},"401":{"description":"Unauthorized"}},"summary":"List proposals for your company","tags":["Governance"]}},"/api/v1/governance/proposals/{id}":{"get":{"operationId":"GovernanceController_getProposal","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Proposal details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalResponseDto"}}}},"404":{"description":"Proposal not found"}},"summary":"Get proposal details with vote results","tags":["Governance"]},"patch":{"operationId":"GovernanceController_updateProposal","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProposalDto"}}}},"responses":{"200":{"description":"Proposal updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalResponseDto"}}}},"400":{"description":"Only draft proposals can be updated"},"401":{"description":"Unauthorized"},"404":{"description":"Proposal not found"}},"summary":"Update a draft proposal","tags":["Governance"]},"delete":{"operationId":"GovernanceController_cancelProposal","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Proposal cancelled"},"400":{"description":"Cannot cancel closed proposals"},"401":{"description":"Unauthorized"},"404":{"description":"Proposal not found"}},"summary":"Cancel a proposal","tags":["Governance"]}},"/api/v1/governance/proposals/{id}/activate":{"post":{"description":"Activates the proposal and notifies all eligible token holders.","operationId":"GovernanceController_activateProposal","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Proposal activated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateProposalResponseDto"}}}},"400":{"description":"Proposal cannot be activated"},"401":{"description":"Unauthorized"},"404":{"description":"Proposal not found"}},"summary":"Activate a proposal and start voting","tags":["Governance"]}},"/api/v1/governance/proposals/{id}/close":{"post":{"description":"Closes the proposal and determines the winning option.","operationId":"GovernanceController_closeProposal","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Proposal closed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloseProposalResponseDto"}}}},"400":{"description":"Proposal cannot be closed"},"401":{"description":"Unauthorized"},"404":{"description":"Proposal not found"}},"summary":"Close voting and calculate results","tags":["Governance"]}},"/api/v1/governance/proposals/{id}/vote":{"post":{"description":"Vote for an option. Your voting power is calculated based on token holdings and tenure.","operationId":"GovernanceController_castVote","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CastVoteDto"}}}},"responses":{"201":{"description":"Vote cast","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteResponseDto"}}}},"400":{"description":"Already voted or invalid option"},"401":{"description":"Unauthorized"},"403":{"description":"Not eligible to vote"},"404":{"description":"Proposal not found"}},"summary":"Cast your vote on a proposal","tags":["Governance"]}},"/api/v1/governance/proposals/{id}/my-vote":{"get":{"operationId":"GovernanceController_getMyVote","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Your vote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteResponseDto"}}}},"401":{"description":"Unauthorized"}},"summary":"Get your vote on a proposal","tags":["Governance"]}},"/api/v1/governance/proposals/{id}/eligibility":{"get":{"description":"Returns your eligibility status and voting power.","operationId":"GovernanceController_checkEligibility","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Eligibility status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EligibilityResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Proposal not found"}},"summary":"Check if you can vote on a proposal","tags":["Governance"]}},"/api/v1/governance/my-proposals":{"get":{"description":"Returns active proposals where you hold tokens and are eligible to vote.","operationId":"GovernanceController_getMyProposals","parameters":[{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Votable proposals","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProposalResponseDto"}}}}},"401":{"description":"Unauthorized"}},"summary":"Get proposals you can vote on","tags":["Governance"]}},"/api/v1/governance/my-votes":{"get":{"operationId":"GovernanceController_getMyVotes","parameters":[{"name":"Authorization","in":"header","description":"Bearer JWT token from Clerk","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Your votes","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VoteResponseDto"}}}}},"401":{"description":"Unauthorized"}},"summary":"Get all your votes with proposal details","tags":["Governance"]}},"/api/v1/governance/public/proposals/{id}":{"get":{"operationId":"GovernanceController_getPublicProposal","parameters":[{"name":"id","required":true,"in":"path","description":"Proposal ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Proposal details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalResponseDto"}}}},"404":{"description":"Proposal not found"}},"summary":"Get public proposal details (no auth required)","tags":["Governance"]}},"/api/v1/governance/public/companies/{companyId}/proposals":{"get":{"operationId":"GovernanceController_getPublicCompanyProposals","parameters":[{"name":"companyId","required":true,"in":"path","description":"Company ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Active proposals","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProposalResponseDto"}}}}}},"summary":"Get active proposals for a company (no auth required)","tags":["Governance"]}},"/api/v1/content/upload-url":{"post":{"description":"Returns a presigned URL for direct upload to S3. Max file size: 4GB.","operationId":"AthleteContentController_getUploadUrl","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUploadUrlDto"}}}},"responses":{"200":{"description":"Upload URL generated successfully"},"400":{"description":"Invalid file type or size"},"404":{"description":"Campaign not found"}},"security":[{"bearer":[]}],"summary":"Get presigned upload URL","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/confirm":{"post":{"description":"Marks content as ready for viewing after successful upload","operationId":"AthleteContentController_confirmUpload","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content UUID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmUploadDto"}}}},"responses":{"200":{"description":"Content confirmed"},"400":{"description":"Upload not found or invalid state"},"403":{"description":"Not content owner"},"404":{"description":"Content not found"}},"security":[{"bearer":[]}],"summary":"Confirm upload completed","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/thumbnail-upload-url":{"post":{"description":"Returns a presigned URL for uploading a custom thumbnail image (JPEG, PNG, WebP)","operationId":"AthleteContentController_getThumbnailUploadUrl","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content UUID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetThumbnailUploadUrlDto"}}}},"responses":{"200":{"description":"Thumbnail upload URL generated"},"400":{"description":"Invalid image type"},"403":{"description":"Not content owner"},"404":{"description":"Content not found"}},"security":[{"bearer":[]}],"summary":"Get thumbnail upload URL","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/thumbnail-confirm":{"post":{"description":"Confirms the custom thumbnail was uploaded and associates it with the content","operationId":"AthleteContentController_confirmThumbnailUpload","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content UUID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmThumbnailUploadDto"}}}},"responses":{"200":{"description":"Thumbnail confirmed"},"400":{"description":"Thumbnail not found in storage"},"403":{"description":"Not content owner"},"404":{"description":"Content not found"}},"security":[{"bearer":[]}],"summary":"Confirm thumbnail upload","tags":["Athlete Content"]}},"/api/v1/content/text-post":{"post":{"description":"Creates a text-only post visible to supporters. No file upload needed.","operationId":"AthleteContentController_createTextPost","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTextPostDto"}}}},"responses":{"201":{"description":"Text post created"},"404":{"description":"Campaign not found"}},"security":[{"bearer":[]}],"summary":"Create text post","tags":["Athlete Content"]}},"/api/v1/content/my-videos":{"get":{"description":"Returns all content uploaded by the authenticated athlete","operationId":"AthleteContentController_listMyContent","parameters":[{"name":"campaignId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Content list returned"}},"security":[{"bearer":[]}],"summary":"List my content","tags":["Athlete Content"]}},"/api/v1/content/{contentId}":{"get":{"operationId":"AthleteContentController_getContent","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get single content item","tags":["Athlete Content"]},"patch":{"description":"Update the title and/or description of content","operationId":"AthleteContentController_updateContent","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content UUID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContentDto"}}}},"responses":{"200":{"description":"Content updated"},"403":{"description":"Not content owner"},"404":{"description":"Content not found"}},"security":[{"bearer":[]}],"summary":"Update content","tags":["Athlete Content"]},"delete":{"description":"Soft deletes content (can be recovered by admin)","operationId":"AthleteContentController_deleteContent","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content UUID","schema":{"type":"string"}}],"responses":{"204":{"description":"Content deleted"},"403":{"description":"Not content owner"},"404":{"description":"Content not found"}},"security":[{"bearer":[]}],"summary":"Delete content","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/pin":{"patch":{"operationId":"AthleteContentController_setPinned","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content UUID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinContentDto"}}}},"responses":{"200":{"description":"Pin state updated"},"403":{"description":"Not content owner"},"404":{"description":"Content not found"}},"security":[{"bearer":[]}],"summary":"Pin or unpin content","tags":["Athlete Content"]}},"/api/v1/content/public-feed/{campaignId}":{"get":{"description":"Returns paginated content with previews only (no full media URLs). No auth required.","operationId":"AthleteContentController_getPublicContentFeed","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign UUID","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (default 1)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Items per page (default 10, max 50)","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","description":"Filter by type: video, image, text","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Search title and description","schema":{"type":"string"}}],"responses":{"200":{"description":"Public content feed returned"},"404":{"description":"Campaign not found"}},"security":[{"bearer":[]}],"summary":"Get public content feed preview","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/public-playback":{"get":{"description":"Returns a signed URL for preview content only. Non-preview content returns 403.","operationId":"AthleteContentController_getPublicPlaybackUrl","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"Playback URL returned"},"403":{"description":"Content is not preview"},"404":{"description":"Content not found"}},"security":[{"bearer":[]}],"summary":"Get playback URL for preview content (no auth)","tags":["Athlete Content"]}},"/api/v1/content/feed/{campaignId}":{"get":{"description":"Returns paginated content for a campaign. Requires pledge or PASS.","operationId":"AthleteContentController_getContentFeed","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign UUID","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (default 1)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Items per page (default 10, max 50)","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","description":"Filter by type: video, image, text","schema":{"type":"string"}}],"responses":{"200":{"description":"Content feed returned"},"403":{"description":"No pledge or PASS"},"404":{"description":"Campaign not found"}},"security":[{"bearer":[]}],"summary":"Get content feed","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/playback":{"get":{"description":"Returns a signed URL to stream the video. Valid for 15 minutes.","operationId":"AthleteContentController_getPlaybackUrl","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"Playback URL returned"},"403":{"description":"No pledge or PASS"},"404":{"description":"Content not found"}},"security":[{"bearer":[]}],"summary":"Get playback URL","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/react":{"post":{"operationId":"AthleteContentController_reactToContent","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactToContentDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"React to content (heart, fire, trophy, clap)","tags":["Athlete Content"]},"delete":{"operationId":"AthleteContentController_removeReaction","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Remove reaction from content","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/reactions":{"get":{"operationId":"AthleteContentController_getReactions","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content ID","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Get reactions for content","tags":["Athlete Content"]}},"/api/v1/content/{contentId}/comments":{"post":{"operationId":"AthleteContentController_addComment","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCommentDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Add a comment to content","tags":["Athlete Content"]},"get":{"operationId":"AthleteContentController_getComments","parameters":[{"name":"contentId","required":true,"in":"path","description":"Content ID","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get comments for content","tags":["Athlete Content"]}},"/api/v1/content/comments/{commentId}":{"delete":{"operationId":"AthleteContentController_deleteComment","parameters":[{"name":"commentId","required":true,"in":"path","description":"Comment ID","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Delete a comment (own or as content owner/moderator)","tags":["Athlete Content"]}},"/api/v1/stream/start":{"post":{"description":"Creates a LiveKit room and returns a publisher token for the athlete","operationId":"StreamController_startStream","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartStreamDto"}}}},"responses":{"200":{"description":"Stream started successfully"},"400":{"description":"Stream already active"},"404":{"description":"Campaign not found"}},"security":[{"bearer":[]}],"summary":"Start live stream","tags":["Live Streaming"]}},"/api/v1/stream/end":{"post":{"description":"Ends the live stream and cleans up the LiveKit room","operationId":"StreamController_endStream","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartStreamDto"}}}},"responses":{"200":{"description":"Stream ended successfully"},"403":{"description":"Not stream owner"},"404":{"description":"No active stream"}},"security":[{"bearer":[]}],"summary":"End live stream","tags":["Live Streaming"]}},"/api/v1/stream/force-stop":{"post":{"description":"Force stops a stream without ownership check. For company admins only.","operationId":"StreamController_forceStopStream","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartStreamDto"}}}},"responses":{"200":{"description":"Stream force stopped"},"403":{"description":"Not company admin"},"404":{"description":"No active stream"}},"security":[{"bearer":[]}],"summary":"Force stop stream (admin)","tags":["Live Streaming"]}},"/api/v1/stream/status/{campaignId}":{"get":{"description":"Check if a campaign has an active live stream","operationId":"StreamController_getStreamStatus","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"Stream status returned"}},"summary":"Get stream status","tags":["Live Streaming"]}},"/api/v1/stream/pending-recording/{campaignId}":{"get":{"description":"Check if there is a pending stream recording awaiting save/discard decision","operationId":"StreamController_getPendingRecording","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"Pending recording info or null"}},"security":[{"bearer":[]}],"summary":"Get pending recording","tags":["Live Streaming"]}},"/api/v1/stream/save-recording":{"post":{"description":"Saves the pending stream recording as content with a title and optional description","operationId":"StreamController_saveRecording","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveRecordingDto"}}}},"responses":{"200":{"description":"Recording saved as content"},"404":{"description":"No pending recording"}},"security":[{"bearer":[]}],"summary":"Save stream recording","tags":["Live Streaming"]}},"/api/v1/stream/discard-recording":{"post":{"description":"Discards the pending stream recording and deletes it from storage","operationId":"StreamController_discardRecording","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartStreamDto"}}}},"responses":{"200":{"description":"Recording discarded"},"404":{"description":"No pending recording"}},"security":[{"bearer":[]}],"summary":"Discard stream recording","tags":["Live Streaming"]}},"/api/v1/stream/access/{campaignId}":{"get":{"description":"Returns whether the user has access via PASS ownership or active pledge","operationId":"StreamController_checkAccess","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"Access check result"}},"security":[{"bearer":[]}],"summary":"Check stream access","tags":["Live Streaming"]}},"/api/v1/stream/join/{campaignId}":{"get":{"description":"Returns a viewer token to watch the stream. Requires PASS or active pledge.","operationId":"StreamController_joinStream","parameters":[{"name":"campaignId","required":true,"in":"path","description":"Campaign UUID","schema":{"type":"string"}},{"name":"displayName","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Join token returned"},"403":{"description":"No PASS or pledge"},"404":{"description":"No active stream"}},"security":[{"bearer":[]}],"summary":"Join live stream","tags":["Live Streaming"]}},"/api/v1/stream/live":{"get":{"description":"Returns all currently live streams the user has access to","operationId":"StreamController_listLiveStreams","parameters":[],"responses":{"200":{"description":"Live streams list returned"}},"security":[{"bearer":[]}],"summary":"List live streams","tags":["Live Streaming"]}},"/api/v1/stream/webhook":{"post":{"description":"Receives events from LiveKit server (room started, ended, participant joined, etc.)","operationId":"StreamController_handleWebhook","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"LiveKit webhook","tags":["Live Streaming"]}},"/api/v1/partner/mint":{"post":{"operationId":"PartnerController_mint","parameters":[{"name":"X-Api-Key","in":"header","description":"Partner API key","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerMintDto"}}}},"responses":{"201":{"description":"Token(s) minted successfully"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Campaign does not belong to this partner"},"409":{"description":"Duplicate externalOrderId (already minted)"}},"summary":"Mint token(s) for a partner sale (no Stripe, no PXL8 signup)","tags":["Partner"]}},"/api/v1/social/instagram/connect":{"get":{"operationId":"SocialController_getInstagramAuthUrl","parameters":[{"name":"source","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get Instagram OAuth URL","tags":["Social Sync"]}},"/api/v1/social/instagram/callback":{"get":{"operationId":"SocialController_handleInstagramCallback","parameters":[{"name":"code","required":true,"in":"query","schema":{"type":"string"}},{"name":"state","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Instagram OAuth callback","tags":["Social Sync"]}},"/api/v1/social/youtube/connect":{"get":{"operationId":"SocialController_getYouTubeAuthUrl","parameters":[{"name":"source","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get YouTube OAuth URL","tags":["Social Sync"]}},"/api/v1/social/youtube/callback":{"get":{"operationId":"SocialController_handleYouTubeCallback","parameters":[{"name":"code","required":true,"in":"query","schema":{"type":"string"}},{"name":"state","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"YouTube OAuth callback","tags":["Social Sync"]}},"/api/v1/social/youtube/connect-channel":{"post":{"operationId":"SocialController_connectYouTubeChannel","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Connect YouTube channel by handle (read-only)","tags":["Social Sync"]}},"/api/v1/social/tiktok/connect":{"get":{"operationId":"SocialController_getTikTokAuthUrl","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get TikTok OAuth URL","tags":["Social Sync"]}},"/api/v1/social/tiktok/callback":{"get":{"operationId":"SocialController_handleTikTokCallback","parameters":[{"name":"code","required":true,"in":"query","schema":{"type":"string"}},{"name":"state","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"TikTok OAuth callback","tags":["Social Sync"]}},"/api/v1/social/connections":{"get":{"operationId":"SocialController_getConnections","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List social connections","tags":["Social Sync"]}},"/api/v1/social/connections/{platform}":{"delete":{"operationId":"SocialController_disconnect","parameters":[{"name":"platform","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Disconnect a social platform","tags":["Social Sync"]}},"/api/v1/social/connections/{platform}/settings":{"patch":{"operationId":"SocialController_updateSettings","parameters":[{"name":"platform","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update social sync settings","tags":["Social Sync"]}},"/api/v1/social/push":{"post":{"operationId":"SocialController_pushToSocial","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Push content to social platforms","tags":["Social Sync"]}},"/api/v1/social/connections/{platform}/sync":{"post":{"operationId":"SocialController_triggerSync","parameters":[{"name":"platform","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Trigger manual content sync","tags":["Social Sync"]}},"/api/v1/social/feed/{campaignId}":{"get":{"operationId":"SocialController_getSyncedFeed","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get synced social content for a campaign","tags":["Social Sync"]}},"/api/v1/chat/{campaignId}/status":{"get":{"operationId":"ChatController_getChatStatus","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get chat availability status","tags":["Chat"]}},"/api/v1/chat/{campaignId}/toggle":{"post":{"operationId":"ChatController_toggleChat","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Toggle chat on/off","tags":["Chat"]}},"/api/v1/chat/{campaignId}/online":{"post":{"operationId":"ChatController_setOnline","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Set athlete online/offline","tags":["Chat"]}},"/api/v1/chat/{campaignId}/messages":{"post":{"operationId":"ChatController_sendMessage","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Send a chat message","tags":["Chat"]},"get":{"operationId":"ChatController_getMessages","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}},{"name":"before","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get chat messages","tags":["Chat"]}},"/api/v1/chat/messages/{messageId}":{"delete":{"operationId":"ChatController_deleteMessage","parameters":[{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a chat message","tags":["Chat"]}},"/api/v1/content/for-you":{"get":{"operationId":"ContentDiscoveryController_getForYouFeed","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}},{"name":"tags","required":false,"in":"query","description":"Comma-separated tags","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["content-discovery"]}},"/api/v1/content/similar/{campaignId}":{"get":{"operationId":"ContentDiscoveryController_getSimilarAthletes","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["content-discovery"]}},"/api/v1/events/calendar/{campaignId}":{"get":{"operationId":"AthleteEventsController_getCalendar","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Max events to return (default 20)","schema":{"type":"number"}},{"name":"includePast","required":false,"in":"query","description":"Include past events (default false)","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Events list"}},"summary":"Get upcoming events for an athlete (public)","tags":["Athlete Events"]}},"/api/v1/events":{"post":{"operationId":"AthleteEventsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAthleteEventDto"}}}},"responses":{"201":{"description":"Event created"}},"security":[{"bearer":[]}],"summary":"Create an event","tags":["Athlete Events"]},"get":{"operationId":"AthleteEventsController_list","parameters":[],"responses":{"200":{"description":"Events list"}},"security":[{"bearer":[]}],"summary":"List your events (all, including past)","tags":["Athlete Events"]}},"/api/v1/events/{id}":{"get":{"operationId":"AthleteEventsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Event details"},"404":{"description":"Not found"}},"security":[{"bearer":[]}],"summary":"Get event by ID","tags":["Athlete Events"]},"patch":{"operationId":"AthleteEventsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAthleteEventDto"}}}},"responses":{"200":{"description":"Event updated"},"404":{"description":"Not found"}},"security":[{"bearer":[]}],"summary":"Update an event","tags":["Athlete Events"]},"delete":{"operationId":"AthleteEventsController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Event deleted"},"404":{"description":"Not found"}},"security":[{"bearer":[]}],"summary":"Delete an event (soft delete)","tags":["Athlete Events"]}},"/api/v1/fight-records/public/{athleteProfileId}":{"get":{"operationId":"FightRecordsController_listPublic","parameters":[{"name":"athleteProfileId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List fight records for an athlete (public)","tags":["Fight Records"]}},"/api/v1/fight-records":{"get":{"operationId":"FightRecordsController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List your fight records","tags":["Fight Records"]},"post":{"operationId":"FightRecordsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFightRecordDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a fight record","tags":["Fight Records"]}},"/api/v1/fight-records/{id}":{"patch":{"operationId":"FightRecordsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFightRecordDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update a fight record","tags":["Fight Records"]},"delete":{"operationId":"FightRecordsController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a fight record (soft delete)","tags":["Fight Records"]}},"/api/v1/predictions/campaign/{campaignId}":{"get":{"operationId":"PredictionsController_getByCampaign","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get active predictions for an athlete","tags":["Predictions"]}},"/api/v1/predictions/active":{"get":{"operationId":"PredictionsController_getActivePredictions","parameters":[],"responses":{"200":{"description":""}},"summary":"Get all active predictions (OPEN + LOCKED)","tags":["Predictions"]}},"/api/v1/predictions/{id}":{"get":{"operationId":"PredictionsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get prediction event details","tags":["Predictions"]}},"/api/v1/predictions/{id}/stats":{"get":{"operationId":"PredictionsController_getStats","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get prediction pick statistics","tags":["Predictions"]}},"/api/v1/predictions/{id}/picks":{"post":{"operationId":"PredictionsController_submitPicks","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Submit prediction picks","tags":["Predictions"]}},"/api/v1/predictions/me/history":{"get":{"operationId":"PredictionsController_getMyPredictions","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get my prediction history","tags":["Predictions"]}},"/api/v1/predictions":{"post":{"operationId":"PredictionsController_create","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a prediction event","tags":["Predictions"]}},"/api/v1/predictions/{id}/resolve":{"post":{"operationId":"PredictionsController_resolve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Resolve prediction with results","tags":["Predictions"]}},"/api/v1/predictions/{id}/cancel":{"post":{"operationId":"PredictionsController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancel a prediction event","tags":["Predictions"]}},"/api/v1/leaderboard/campaign/{campaignId}":{"get":{"operationId":"LeaderboardController_getByCampaign","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get prediction leaderboard for an athlete","tags":["Leaderboard"]}},"/api/v1/leaderboard/global":{"get":{"operationId":"LeaderboardController_getGlobal","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get global prediction leaderboard","tags":["Leaderboard"]}},"/api/v1/leaderboard/me":{"get":{"operationId":"LeaderboardController_getMyRank","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get my leaderboard rank and stats","tags":["Leaderboard"]}},"/api/v1/collectibles/campaign/{campaignId}":{"get":{"operationId":"CollectiblesController_listByCampaign","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Browse collectibles for an athlete","tags":["Collectibles"]}},"/api/v1/collectibles/me":{"get":{"operationId":"CollectiblesController_getMyCollection","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get my collectible collection","tags":["Collectibles"]}},"/api/v1/collectibles/{id}/purchase":{"post":{"operationId":"CollectiblesController_purchase","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Purchase a collectible with PXL8 coin","tags":["Collectibles"]}},"/api/v1/collectibles":{"post":{"operationId":"CollectiblesController_create","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a collectible","tags":["Collectibles"]}},"/api/v1/coin/balance":{"get":{"operationId":"AthleteCoinController_getBalance","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get athlete coin balance","tags":["Athlete Coin"]}},"/api/v1/coin/transactions":{"get":{"operationId":"AthleteCoinController_getTransactions","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get athlete coin transactions","tags":["Athlete Coin"]}},"/api/v1/profiles/me":{"get":{"operationId":"ProfilesController_getMine","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get the authenticated user's own profile","tags":["Athlete Profiles"]}},"/api/v1/profiles":{"post":{"operationId":"ProfilesController_create","parameters":[{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProfileDto"}}}},"responses":{"201":{"description":""}},"summary":"Create profile (onboarding)","tags":["Athlete Profiles"]}},"/api/v1/profiles/{id}":{"put":{"operationId":"ProfilesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":""}},"summary":"Update profile","tags":["Athlete Profiles"]}},"/api/v1/profiles/{id}/image":{"post":{"operationId":"ProfilesController_uploadImage","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":""}},"summary":"Upload profile photo","tags":["Athlete Profiles"]}},"/api/v1/profiles/{id}/cover":{"post":{"operationId":"ProfilesController_uploadCover","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":""}},"summary":"Upload cover photo","tags":["Athlete Profiles"]}},"/api/v1/public/profiles":{"get":{"operationId":"PublicProfilesController_list","parameters":[{"name":"discipline","required":false,"in":"query","schema":{"type":"string"}},{"name":"country","required":false,"in":"query","schema":{"type":"string"}},{"name":"featured","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Browse athlete profiles (channel cards)","tags":["Public Profiles"]}},"/api/v1/public/profiles/{slug}":{"get":{"operationId":"PublicProfilesController_getBySlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"404":{"description":"Profile not found"}},"summary":"Get a single profile by slug","tags":["Public Profiles"]}},"/api/v1/public/profiles/{slug}/passes":{"get":{"operationId":"PublicProfilesController_listPasses","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"List PASSes for a profile","tags":["Public Profiles"]}},"/api/v1/public/profiles/{slug}/content":{"get":{"operationId":"PublicProfilesController_listContent","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Public content feed for a profile (PUBLIC tier only)","tags":["Public Profiles"]}},"/api/v1/metrics":{"get":{"operationId":"PrometheusController_index","parameters":[],"responses":{"200":{"description":""}},"tags":["Prometheus"]}},"/api/v1/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"tags":["Health"]}},"/api/v1/health/ready":{"get":{"operationId":"HealthController_ready","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"tags":["Health"]}},"/api/v1/health/live":{"get":{"operationId":"HealthController_live","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"tags":["Health"]}},"/api/v1/api/v1/admin/dashboard/stats":{"get":{"operationId":"AdminController_getDashboardStats","parameters":[],"responses":{"200":{"description":"Dashboard stats retrieved"}},"summary":"Get dashboard statistics","tags":["Admin"]}},"/api/v1/api/v1/admin/assets":{"get":{"operationId":"AssetsAdminController_getAssets","parameters":[],"responses":{"200":{"description":""}},"summary":"List all assets","tags":["Admin - Assets"]},"post":{"operationId":"AssetsAdminController_createAsset","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssetDto"}}}},"responses":{"201":{"description":""}},"summary":"Create new asset","tags":["Admin - Assets"]}},"/api/v1/api/v1/admin/assets/{id}":{"get":{"operationId":"AssetsAdminController_getAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get asset by ID","tags":["Admin - Assets"]},"put":{"operationId":"AssetsAdminController_updateAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssetDto"}}}},"responses":{"200":{"description":""}},"summary":"Update asset","tags":["Admin - Assets"]},"delete":{"operationId":"AssetsAdminController_deleteAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Delete asset","tags":["Admin - Assets"]}},"/api/v1/api/v1/admin/assets/{id}/approve":{"post":{"operationId":"AssetsAdminController_approveAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveAssetDto"}}}},"responses":{"200":{"description":"Asset approved successfully"},"400":{"description":"Asset cannot be approved (invalid status)"},"404":{"description":"Asset not found"}},"summary":"Approve an asset (set status to ACTIVE)","tags":["Admin - Assets"]}},"/api/v1/api/v1/admin/assets/{id}/reject":{"post":{"operationId":"AssetsAdminController_rejectAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectAssetDto"}}}},"responses":{"200":{"description":"Asset rejected successfully"},"400":{"description":"Asset cannot be rejected (invalid status)"},"404":{"description":"Asset not found"}},"summary":"Reject an asset with reason","tags":["Admin - Assets"]}},"/api/v1/api/v1/admin/assets/{id}/status":{"patch":{"operationId":"AssetsAdminController_changeStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeStatusDto"}}}},"responses":{"200":{"description":"Status changed successfully"},"400":{"description":"Invalid status transition"},"404":{"description":"Asset not found"}},"summary":"Change asset status","tags":["Admin - Assets"]}},"/api/v1/api/v1/admin/purchases":{"get":{"operationId":"PurchasesAdminController_getPurchases","parameters":[],"responses":{"200":{"description":""}},"summary":"List all purchases","tags":["Admin - Purchases"]}},"/api/v1/api/v1/admin/purchases/{id}":{"get":{"operationId":"PurchasesAdminController_getPurchase","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get purchase by ID","tags":["Admin - Purchases"]}},"/api/v1/api/v1/admin/purchases/{id}/retry-mint":{"post":{"operationId":"PurchasesAdminController_retryMint","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Retry failed token minting","tags":["Admin - Purchases"]}},"/api/v1/api/v1/admin/customers":{"get":{"operationId":"CustomersAdminController_getCustomers","parameters":[],"responses":{"200":{"description":""}},"summary":"List all customers","tags":["Admin - Customers"]}},"/api/v1/api/v1/admin/customers/{id}":{"get":{"operationId":"CustomersAdminController_getCustomer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get customer by ID","tags":["Admin - Customers"]}},"/api/v1/api/v1/admin/customers/{id}/portfolio":{"get":{"operationId":"CustomersAdminController_getCustomerPortfolio","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get customer portfolio","tags":["Admin - Customers"]}},"/api/v1/reward-commitments":{"post":{"operationId":"RewardCommitmentController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRewardCommitmentDto"}}}},"responses":{"201":{"description":"Reward commitment created successfully"},"400":{"description":"Invalid input"}},"summary":"Create a new reward commitment","tags":["Reward Commitments"]}},"/api/v1/reward-commitments/{id}":{"get":{"operationId":"RewardCommitmentController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Reward commitment found"},"404":{"description":"Reward commitment not found"}},"summary":"Get reward commitment by ID","tags":["Reward Commitments"]},"patch":{"operationId":"RewardCommitmentController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRewardCommitmentDto"}}}},"responses":{"200":{"description":"Reward commitment updated"},"404":{"description":"Reward commitment not found"}},"summary":"Update a reward commitment","tags":["Reward Commitments"]}},"/api/v1/reward-commitments/campaign/{campaignId}":{"get":{"operationId":"RewardCommitmentController_getByCampaignId","parameters":[{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Reward commitment found or null"}},"summary":"Get reward commitment by campaign ID","tags":["Reward Commitments"]}},"/api/v1/reward-commitments/company/{companyId}":{"get":{"operationId":"RewardCommitmentController_getByCompanyId","parameters":[{"name":"companyId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"List of reward commitments"}},"summary":"Get all reward commitments for a company","tags":["Reward Commitments"]}},"/api/v1/reward-triggers/{id}/submit":{"post":{"operationId":"RewardTriggerController_submit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitTriggerDto"}}}},"responses":{"200":{"description":"Trigger submitted for verification"},"400":{"description":"Trigger cannot be submitted"},"404":{"description":"Trigger not found"}},"summary":"Submit a trigger for verification","tags":["Reward Triggers"]}},"/api/v1/reward-triggers/{id}/verify":{"post":{"operationId":"RewardTriggerController_verify","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyTriggerDto"}}}},"responses":{"200":{"description":"Trigger verified"},"400":{"description":"Trigger cannot be verified or missing rejection reason"},"404":{"description":"Trigger not found"}},"summary":"Verify (approve/reject) a submitted trigger","tags":["Reward Triggers"]}},"/api/v1/reward-triggers/pending":{"get":{"operationId":"RewardTriggerController_getPending","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"List of pending triggers"}},"summary":"Get all triggers pending verification (admin)","tags":["Reward Triggers"]}},"/api/v1/contracts/current":{"get":{"operationId":"ContractVersionController_getCurrent","parameters":[],"responses":{"200":{"description":"Current contract version"},"404":{"description":"No active contract found"}},"summary":"Get current active contract version","tags":["Contract Versions"]}},"/api/v1/contracts":{"get":{"operationId":"ContractVersionController_getAll","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"List of contract versions"}},"summary":"Get all contract versions","tags":["Contract Versions"]}},"/api/v1/contracts/{version}":{"get":{"operationId":"ContractVersionController_getByVersion","parameters":[{"name":"version","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Contract version found"},"404":{"description":"Contract version not found"}},"summary":"Get contract by version number","tags":["Contract Versions"]}}},"info":{"title":"PXL8 Blockchain Service","description":"Multi-chain blockchain service for deploying tokens & NFTs via factory contracts","version":"1.0","contact":{}},"tags":[{"name":"Blockchain","description":"Token and NFT deployment operations"}],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"DeployTokenDto":{"type":"object","properties":{"chainId":{"type":"number","example":80002,"description":"Chain ID (80002 = Polygon Amoy, 137 = Polygon, 8453 = Base)"},"name":{"type":"string","example":"Lakers Token","description":"Token name"},"symbol":{"type":"string","example":"LAL","description":"Token symbol (3-5 characters recommended)"},"supply":{"type":"string","example":"1000000","description":"Total supply (in tokens, not wei). Will be minted to owner."},"projectURI":{"type":"string","example":"ipfs://QmXxxx...","description":"IPFS URI for project metadata"},"companyId":{"type":"string","example":"company_2abc123","description":"Company ID"},"ownerId":{"type":"string","example":"user_2xyz789","description":"Owner Clerk user ID (will receive initial supply)"}},"required":["chainId","name","symbol","supply","projectURI","companyId","ownerId"]},"DeployNFTDto":{"type":"object","properties":{"chainId":{"type":"number","example":80002,"description":"Chain ID (80002 = Polygon Amoy, 137 = Polygon, 8453 = Base)"},"name":{"type":"string","example":"Lakers NFT Collection","description":"NFT collection name"},"symbol":{"type":"string","example":"LALNFT","description":"NFT collection symbol"},"royaltyBps":{"type":"number","example":1000,"description":"Royalty in basis points (1000 = 10%, 250 = 2.5%). Max 10000."},"royaltyReceiver":{"type":"string","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","description":"Address that receives royalties (usually company wallet)"},"companyId":{"type":"string","example":"company_2abc123","description":"Company ID"},"ownerId":{"type":"string","example":"user_2xyz789","description":"Owner Clerk user ID (contract owner)"}},"required":["chainId","name","symbol","royaltyBps","royaltyReceiver","companyId","ownerId"]},"GetContractInfoDto":{"type":"object","properties":{"chainId":{"type":"number","example":80002,"description":"Chain ID"},"contractAddress":{"type":"string","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","description":"Contract address"}},"required":["chainId","contractAddress"]},"MintTokenDto":{"type":"object","properties":{"amount":{"type":"string","example":"1000000","description":"Amount of tokens to mint (in tokens, not wei)"},"recipientAddress":{"type":"string","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","description":"Recipient wallet address"},"gasless":{"type":"boolean","example":false,"description":"Use gasless transaction via smart wallet (if available)","default":false}},"required":["amount","recipientAddress"]},"MintNFTDto":{"type":"object","properties":{"recipientAddress":{"type":"string","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","description":"Recipient wallet address"},"tokenURI":{"type":"string","example":"ipfs://QmXxxx.../1.json","description":"IPFS URI for NFT metadata (from Pinata)"},"gasless":{"type":"boolean","example":false,"description":"Use gasless transaction via smart wallet (if available)","default":false}},"required":["recipientAddress","tokenURI"]},"BatchMintNFTDto":{"type":"object","properties":{"quantity":{"type":"number","example":10,"description":"Number of NFTs to mint"},"recipientAddress":{"type":"string","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","description":"Recipient wallet address"},"baseTokenURI":{"type":"string","example":"ipfs://QmXxxx.../","description":"Base IPFS URI for NFT metadata (will append tokenId)"},"gasless":{"type":"boolean","example":false,"description":"Use gasless transaction via smart wallet (if available)","default":false}},"required":["quantity","recipientAddress","baseTokenURI"]},"CompanyTransactionResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Transaction ID","example":"tx_123abc"},"chainId":{"type":"number","description":"Chain ID","example":137},"txHash":{"type":"string","description":"Transaction hash","example":"0x123abc..."},"type":{"type":"string","description":"Transaction type","enum":["DEPLOY","MINT","TRANSFER","BURN","APPROVE","OTHER"]},"status":{"type":"string","description":"Transaction status","enum":["PENDING","CONFIRMED","FAILED"]},"blockNumber":{"type":"object","description":"Block number","example":12345678,"nullable":true},"gasUsed":{"type":"object","description":"Gas used","example":"21000","nullable":true},"gasPriceGwei":{"type":"object","description":"Gas price in Gwei","example":"30.5","nullable":true},"fromAddress":{"type":"string","description":"From address","example":"0x123..."},"toAddress":{"type":"object","description":"To address","example":"0x456...","nullable":true},"value":{"type":"object","description":"Value in wei","example":"1000000000000000000","nullable":true},"data":{"type":"object","description":"Transaction data","nullable":true},"error":{"type":"object","description":"Error message","nullable":true},"createdAt":{"format":"date-time","type":"string","description":"Created at","example":"2025-10-23T10:00:00Z"},"confirmedAt":{"type":"object","description":"Confirmed at","example":"2025-10-23T10:01:00Z","nullable":true}},"required":["id","chainId","txHash","type","status","blockNumber","gasUsed","gasPriceGwei","fromAddress","toAddress","value","data","error","createdAt","confirmedAt"]},"PaginationDto":{"type":"object","properties":{"page":{"type":"number","description":"Current page","example":1},"pageSize":{"type":"number","description":"Items per page","example":20},"totalCount":{"type":"number","description":"Total number of items","example":100},"totalPages":{"type":"number","description":"Total number of pages","example":5}},"required":["page","pageSize","totalCount","totalPages"]},"GetCompanyTransactionsResponseDto":{"type":"object","properties":{"transactions":{"description":"List of transactions","type":"array","items":{"$ref":"#/components/schemas/CompanyTransactionResponseDto"}},"pagination":{"description":"Pagination information","allOf":[{"$ref":"#/components/schemas/PaginationDto"}]}},"required":["transactions","pagination"]},"DateRangeDto":{"type":"object","properties":{"startDate":{"type":"object","description":"Start date","example":"2025-10-01T00:00:00Z","nullable":true},"endDate":{"type":"object","description":"End date","example":"2025-10-31T23:59:59Z","nullable":true}},"required":["startDate","endDate"]},"GasMetricsDto":{"type":"object","properties":{"totalGasUsedWei":{"type":"string","description":"Total gas used in Wei","example":"2100000"},"totalGasCostWei":{"type":"string","description":"Total gas cost in Wei","example":"63000000000000"},"totalGasCostEther":{"type":"string","description":"Total gas cost in Ether","example":"0.000063000"},"averageGasCostPerTransaction":{"type":"string","description":"Average gas cost per transaction in Ether","example":"0.000021000"}},"required":["totalGasUsedWei","totalGasCostWei","totalGasCostEther","averageGasCostPerTransaction"]},"ChainStatsDto":{"type":"object","properties":{"chainId":{"type":"number","description":"Chain ID","example":137},"chainName":{"type":"string","description":"Chain name","example":"Polygon Mainnet"},"transactionCount":{"type":"number","description":"Number of transactions","example":10},"totalGasCost":{"type":"string","description":"Total gas cost in Ether","example":"0.000500000"}},"required":["chainId","chainName","transactionCount","totalGasCost"]},"BreakdownsDto":{"type":"object","properties":{"byType":{"type":"object","description":"Transaction count by type","example":{"DEPLOY":2,"MINT":8,"TRANSFER":5}},"byStatus":{"type":"object","description":"Transaction count by status","example":{"CONFIRMED":14,"FAILED":1,"PENDING":0}},"byChain":{"description":"Transaction statistics by chain","type":"array","items":{"$ref":"#/components/schemas/ChainStatsDto"}}},"required":["byType","byStatus","byChain"]},"TransactionStatsResponseDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID","example":"company_123"},"dateRange":{"description":"Date range for statistics","allOf":[{"$ref":"#/components/schemas/DateRangeDto"}]},"totalTransactions":{"type":"number","description":"Total number of transactions","example":15},"gasMetrics":{"description":"Gas usage metrics","allOf":[{"$ref":"#/components/schemas/GasMetricsDto"}]},"breakdowns":{"description":"Transaction breakdowns","allOf":[{"$ref":"#/components/schemas/BreakdownsDto"}]}},"required":["companyId","dateRange","totalTransactions","gasMetrics","breakdowns"]},"NFTResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440001"},"companyId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440002"},"campaignId":{"type":"object","example":"550e8400-e29b-41d4-a716-446655440003"},"collectionId":{"type":"object","example":"550e8400-e29b-41d4-a716-446655440004"},"name":{"type":"string","example":"Rare Dragon NFT"},"description":{"type":"object","example":"A unique dragon NFT with fire-breathing abilities"},"imageUrl":{"type":"object","example":"https://cdn.example.com/nft/dragon-123.png"},"metadataUri":{"type":"object","example":"ipfs://QmXxxx.../metadata.json"},"tokenId":{"type":"object","example":"42"},"ownerId":{"type":"object","example":"user_2abc123def456"},"minterId":{"type":"object","example":"user_2xyz789abc123"},"status":{"type":"string","example":"MINTED","enum":["PENDING","MINTED","TRANSFERRED","BURNED"]},"isTransferable":{"type":"boolean","example":true},"royaltyPercentage":{"type":"number","example":2.5},"mintedAt":{"type":"object","example":"2025-01-15T10:30:00Z"},"metadata":{"type":"object","example":{"rarity":"legendary","attributes":["fire","flying"]}},"createdAt":{"format":"date-time","type":"string","example":"2025-01-10T08:00:00Z"},"updatedAt":{"format":"date-time","type":"string","example":"2025-01-15T10:30:00Z"}},"required":["id","companyId","name","status","isTransferable","royaltyPercentage","createdAt","updatedAt"]},"NFTListResponseDto":{"type":"object","properties":{"nfts":{"type":"array","items":{"$ref":"#/components/schemas/NFTResponseDto"}},"total":{"type":"number","example":42},"limit":{"type":"number","example":20},"offset":{"type":"number","example":0}},"required":["nfts","total","limit","offset"]},"TokenResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440001"},"companyId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440002"},"campaignId":{"type":"object","example":"550e8400-e29b-41d4-a716-446655440003"},"tokenSymbol":{"type":"object","example":"PXL8","description":"Token symbol from campaign (available in metadata)"},"tokenNumber":{"type":"string","example":"TOKEN-001"},"ownerId":{"type":"object","example":"user_2abc123def456"},"status":{"type":"string","example":"MINTED","enum":["PENDING","MINTED","ACTIVE","TRANSFERRED","BURNED"]},"blockchainStatus":{"type":"object","example":"confirmed"},"walletAddress":{"type":"object","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"},"contractAddress":{"type":"object","example":"0x853d955aCEf822Db058eb8505911ED77F175b99e"},"chainId":{"type":"number","example":137},"onChainTokenId":{"type":"object","example":"42"},"transactionHash":{"type":"object","example":"0x456def..."},"blockNumber":{"type":"object","example":12346},"basePrice":{"type":"object","example":100.5},"currency":{"type":"object","example":"USD"},"burned":{"type":"boolean","example":false},"burnedAt":{"type":"object","example":"2025-01-20T15:00:00Z"},"mintedAt":{"type":"object","example":"2025-01-15T10:30:00Z"},"metadata":{"type":"object","example":{"imageUrl":"https://cdn.example.com/tokens/token-123.png","description":"Limited edition token","attributes":{"rarity":"rare"}}},"createdAt":{"format":"date-time","type":"string","example":"2025-01-10T08:00:00Z"},"updatedAt":{"format":"date-time","type":"string","example":"2025-01-15T10:30:00Z"}},"required":["id","companyId","tokenNumber","status","chainId","burned","createdAt","updatedAt"]},"TokenAnalyticsResponseDto":{"type":"object","properties":{"tokenId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440001","description":"Token ID"},"tokenName":{"type":"string","example":"PXL8 Loyalty Token","description":"Token name from campaign"},"tokenSymbol":{"type":"string","example":"PXL8","description":"Token symbol from campaign"},"custodialWalletAddress":{"type":"object","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","description":"Company custodial wallet address holding tokens"},"mintedVolume":{"type":"number","example":1000000,"description":"Total number of tokens minted"},"mintedVolumeChange":{"type":"object","example":15.5,"description":"Percentage change in minted volume (requires historical data)"},"averageGasFee":{"type":"object","example":0.002,"description":"Average gas fee in native currency - only populated when real gas tracking data is available"},"chainName":{"type":"string","example":"Polygon","description":"Blockchain network name"},"chainId":{"type":"number","example":137,"description":"Chain ID"},"lastPrice":{"type":"number","example":1.25,"description":"Current token price in USD"},"lastPriceChange":{"type":"object","example":5.2,"description":"Price change percentage (24h) - only populated when price history data is available"},"dexAuditStatus":{"type":"string","example":"passed","enum":["passed","failed","pending","not_audited"],"description":"DEX audit status - only populated when audit data is available"},"custodialPercentage":{"type":"number","example":35.5,"description":"Percentage of tokens held in custodial wallets"},"totalSupply":{"type":"number","example":1000000,"description":"Total token supply"},"circulatingSupply":{"type":"number","example":850000,"description":"Circulating supply (non-custodial tokens)"},"contractAddress":{"type":"object","example":"0x853d955aCEf822Db058eb8505911ED77F175b99e","description":"Token contract address"},"uniqueHolders":{"type":"number","example":500,"description":"Number of unique token holders"},"custodialHolders":{"type":"number","example":150,"description":"Number of custodial holders"},"selfCustodialHolders":{"type":"number","example":350,"description":"Number of self-custodial holders"},"totalValue":{"type":"number","example":1250000.5,"description":"Total market value in USD"},"transactionCount":{"type":"number","example":250,"description":"Total number of transactions"},"mintedAt":{"type":"object","example":"2025-01-15T10:30:00Z","description":"When the token was minted"},"updatedAt":{"format":"date-time","type":"string","example":"2025-01-20T15:45:00Z","description":"Last updated timestamp"}},"required":["tokenId","tokenName","tokenSymbol","mintedVolume","chainName","chainId","lastPrice","custodialPercentage","totalSupply","circulatingSupply","uniqueHolders","custodialHolders","selfCustodialHolders","totalValue","transactionCount","updatedAt"]},"TokenHolderDto":{"type":"object","properties":{"address":{"type":"string","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb","description":"Wallet address of the holder"},"balance":{"type":"number","example":1500,"description":"Number of tokens held"},"percentage":{"type":"number","example":15.5,"description":"Percentage of total supply"},"custodyType":{"type":"string","example":"CUSTODIAL","enum":["CUSTODIAL","SELF_CUSTODIAL"],"description":"Type of custody"},"firstAcquired":{"type":"string","example":"2025-01-10T08:00:00Z","description":"When holder first acquired tokens"},"lastActivity":{"type":"string","example":"2025-01-20T15:45:00Z","description":"Last activity timestamp"}},"required":["address","balance","percentage","custodyType","firstAcquired","lastActivity"]},"TokenHoldersResponseDto":{"type":"object","properties":{"tokenId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440001","description":"Token ID"},"campaignId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440003","description":"Campaign ID"},"campaignName":{"type":"string","example":"PXL8 Loyalty Campaign","description":"Campaign name"},"totalHolders":{"type":"number","example":150,"description":"Total number of unique holders"},"totalSupply":{"type":"number","example":10000,"description":"Total token supply"},"holders":{"description":"List of token holders","type":"array","items":{"$ref":"#/components/schemas/TokenHolderDto"}},"pagination":{"type":"object","example":{"total":150,"limit":50,"offset":0},"description":"Pagination information"}},"required":["tokenId","campaignId","campaignName","totalHolders","totalSupply","holders","pagination"]},"PXL8LChainStatsDto":{"type":"object","properties":{"chainId":{"type":"number","example":137},"chainName":{"type":"string","example":"Polygon"},"contractAddress":{"type":"object","example":"0x..."},"price":{"type":"number","example":0.25},"priceChange24h":{"type":"object","example":5.2},"liquidity":{"type":"object","example":50000},"volume24h":{"type":"object","example":12000},"totalSupply":{"type":"number","example":1000000},"circulatingSupply":{"type":"number","example":800000},"holders":{"type":"number","example":150},"lastUpdated":{"type":"string","example":"2025-11-05T20:00:00Z"},"estimatedGasFee":{"type":"object","example":0.1},"effectivePrice":{"type":"number","example":0.35},"isBestChain":{"type":"boolean","example":false}},"required":["chainId","chainName","price","totalSupply","circulatingSupply","holders","lastUpdated","effectivePrice","isBestChain"]},"ArbitrageOpportunityDto":{"type":"object","properties":{"buyChain":{"type":"string","example":"Polygon"},"buyChainId":{"type":"number","example":137},"buyPrice":{"type":"number","example":0.25},"sellChain":{"type":"string","example":"Ethereum"},"sellChainId":{"type":"number","example":1},"sellPrice":{"type":"number","example":0.3},"priceDifference":{"type":"number","example":0.05},"profitPercentage":{"type":"number","example":20},"estimatedGasCost":{"type":"number","example":15.1},"netProfit":{"type":"number","example":-15.05}},"required":["buyChain","buyChainId","buyPrice","sellChain","sellChainId","sellPrice","priceDifference","profitPercentage","estimatedGasCost","netProfit"]},"PXL8LMultiChainStatsResponseDto":{"type":"object","properties":{"tokenSymbol":{"type":"string","example":"PXL8L"},"tokenName":{"type":"string","example":"PXL8 Token"},"totalSupply":{"type":"number","example":5000000},"totalCirculatingSupply":{"type":"number","example":4000000},"totalHolders":{"type":"number","example":850},"totalLiquidity":{"type":"number","example":250000},"total24hVolume":{"type":"number","example":50000},"averagePrice":{"type":"number","example":0.28},"lowestPrice":{"type":"number","example":0.25},"highestPrice":{"type":"number","example":0.32},"chains":{"type":"array","items":{"$ref":"#/components/schemas/PXL8LChainStatsDto"}},"arbitrageOpportunities":{"type":"array","items":{"$ref":"#/components/schemas/ArbitrageOpportunityDto"}},"bestChainToBuy":{"type":"object","example":{"chainId":137,"chainName":"Polygon","price":0.25,"effectivePrice":0.35,"reason":"Lowest effective price (0.2500 + 0.10 gas)"}},"lastUpdated":{"type":"string","example":"2025-11-05T20:00:00Z"}},"required":["tokenSymbol","tokenName","totalSupply","totalCirculatingSupply","totalHolders","totalLiquidity","total24hVolume","averagePrice","lowestPrice","highestPrice","chains","arbitrageOpportunities","bestChainToBuy","lastUpdated"]},"TokenListResponseDto":{"type":"object","properties":{"tokens":{"type":"array","items":{"$ref":"#/components/schemas/TokenResponseDto"}},"total":{"type":"number","example":42},"limit":{"type":"number","example":20},"offset":{"type":"number","example":0}},"required":["tokens","total","limit","offset"]},"UploadTokenImageResponseDto":{"type":"object","properties":{"tokenId":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440001"},"imageUrl":{"type":"string","example":"https://pxl8-assets.nyc3.digitaloceanspaces.com/tokens/company-123/token-456.png"},"cdnUrl":{"type":"string","example":"https://pxl8-assets.nyc3.cdn.digitaloceanspaces.com/tokens/company-123/token-456.png"}},"required":["tokenId","imageUrl","cdnUrl"]},"TokenDetailsTokenDto":{"type":"object","properties":{"id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440001"},"tokenNumber":{"type":"string","example":"TOKEN-001"},"status":{"type":"string","example":"MINTED","enum":["PENDING","MINTED","ACTIVE","TRANSFERRED","BURNED"]},"custodyType":{"type":"string","example":"CUSTODIAL","enum":["CUSTODIAL","SELF_CUSTODIAL"]},"category":{"type":"string","example":"UTILITY","enum":["UTILITY","OWNERSHIP","ONCHAIN_DEFI"]}},"required":["id","tokenNumber","status","custodyType","category"]},"TokenDetailsCampaignDto":{"type":"object","properties":{"id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440003"},"name":{"type":"string","example":"PXL8 Loyalty Campaign"},"slug":{"type":"string","example":"pxl8-loyalty-campaign"},"description":{"type":"object","example":"Earn rewards with every purchase"},"assetType":{"type":"string","example":"TOKEN"},"tokenSymbol":{"type":"object","example":"PXL8"},"tokenName":{"type":"object","example":"PXL8 Loyalty Token"},"totalSupply":{"type":"object","example":1000000},"pricePerToken":{"type":"object","example":10.5},"imageUrl":{"type":"object","example":"https://cdn.example.com/campaign.png"},"status":{"type":"string","example":"ACTIVE","enum":["DRAFT","ACTIVE","PAUSED","COMPLETED","ARCHIVED"]},"startDate":{"type":"object","example":"2025-01-01T00:00:00Z"},"endDate":{"type":"object","example":"2025-12-31T23:59:59Z"}},"required":["id","name","slug","status"]},"TokenDetailsOwnershipDto":{"type":"object","properties":{"ownerId":{"type":"object","example":"user_2abc123def456"},"ownerEmail":{"type":"object","example":"user@example.com"},"purchasedAt":{"format":"date-time","type":"string","example":"2025-01-15T10:30:00Z"},"mintedAt":{"type":"object","example":"2025-01-16T08:00:00Z"},"holdingPeriod":{"type":"string","example":"5 days"}},"required":["purchasedAt","holdingPeriod"]},"TokenDetailsPurchaseDto":{"type":"object","properties":{"priceAtPurchase":{"type":"object","example":10.5},"currency":{"type":"string","example":"USD"},"stripePaymentIntentId":{"type":"object","example":"pi_1234567890abcdef"},"purchaseIntentId":{"type":"object","example":"550e8400-e29b-41d4-a716-446655440005"}}},"TokenDetailsBlockchainDto":{"type":"object","properties":{"chainId":{"type":"number","example":137},"network":{"type":"string","example":"Polygon"},"networkType":{"type":"string","example":"mainnet"},"contractAddress":{"type":"object","example":"0x853d955aCEf822Db058eb8505911ED77F175b99e"},"walletAddress":{"type":"object","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"},"custodialWalletAddress":{"type":"object","example":"0x853d955aCEf822Db058eb8505911ED77F175b99e"},"onChainTokenId":{"type":"object","example":"42"},"transactionHash":{"type":"object","example":"0x456def..."},"blockNumber":{"type":"object","example":12346},"onChainMinted":{"type":"boolean","example":true},"blockchainStatus":{"type":"object","example":"confirmed"}},"required":["chainId","network","networkType","onChainMinted"]},"TokenDetailsDeFiDto":{"type":"object","properties":{"factoryAddress":{"type":"object","example":"0x1f98431c8ad98523631ae4a59f267346ea31f984"},"poolAddress":{"type":"object","example":"0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8"},"dexName":{"type":"object","example":"Uniswap V3"},"isLiquidityAdded":{"type":"boolean","example":false},"liquidityAmount":{"type":"object","example":50000},"useDexPricing":{"type":"boolean","example":false},"migratedFrom":{"type":"string","example":"UTILITY","enum":["UTILITY","OWNERSHIP","ONCHAIN_DEFI"]},"migratedAt":{"type":"object","example":"2025-01-20T12:00:00Z"}},"required":["isLiquidityAdded","useDexPricing"]},"TokenDetailsPricingDto":{"type":"object","properties":{"basePrice":{"type":"object","example":10.5},"currency":{"type":"object","example":"USD"},"useDexPricing":{"type":"boolean","example":false}},"required":["useDexPricing"]},"TokenDetailsCertificateDto":{"type":"object","properties":{"downloadUrl":{"type":"string","example":"/api/v1/tokens/550e8400-e29b-41d4-a716-446655440001/certificate.pdf"},"available":{"type":"boolean","example":true}},"required":["downloadUrl","available"]},"TokenDetailsDatesDto":{"type":"object","properties":{"createdAt":{"format":"date-time","type":"string","example":"2025-01-15T10:30:00Z"},"updatedAt":{"format":"date-time","type":"string","example":"2025-01-20T15:45:00Z"},"mintedAt":{"type":"object","example":"2025-01-16T08:00:00Z"},"burnedAt":{"type":"object","example":"2025-02-01T12:00:00Z"},"deletedAt":{"type":"object","example":null}},"required":["createdAt","updatedAt"]},"TokenDetailsResponseDto":{"type":"object","properties":{"token":{"$ref":"#/components/schemas/TokenDetailsTokenDto"},"campaign":{"$ref":"#/components/schemas/TokenDetailsCampaignDto"},"ownership":{"$ref":"#/components/schemas/TokenDetailsOwnershipDto"},"purchase":{"$ref":"#/components/schemas/TokenDetailsPurchaseDto"},"blockchain":{"$ref":"#/components/schemas/TokenDetailsBlockchainDto"},"defi":{"$ref":"#/components/schemas/TokenDetailsDeFiDto"},"pricing":{"$ref":"#/components/schemas/TokenDetailsPricingDto"},"benefits":{"example":["Revenue sharing","Voting rights","Exclusive merchandise"],"type":"array","items":{"type":"string"}},"certificate":{"$ref":"#/components/schemas/TokenDetailsCertificateDto"},"metadata":{"type":"object","example":{"purchasePrice":10.5,"purchaseCurrency":"USD","ownerEmail":"user@example.com"}},"dates":{"$ref":"#/components/schemas/TokenDetailsDatesDto"},"burned":{"type":"boolean","example":false}},"required":["token","ownership","blockchain","pricing","benefits","certificate","dates","burned"]},"TrackPriceDto":{"type":"object","properties":{"contractAddress":{"type":"string","example":"0x853d955aCEf822Db058eb8505911ED77F175b99e"},"chainId":{"type":"number","example":137},"price":{"type":"number","example":1.25},"priceUsd":{"type":"number","example":1.25},"liquidity":{"type":"string","example":"{\"pool\": \"0x123...\", \"amount\": \"1000000\"}"},"volume24h":{"type":"number","example":50000.5},"priceChange24h":{"type":"number","example":5.2},"high24h":{"type":"number","example":1.3},"low24h":{"type":"number","example":1.2},"source":{"type":"string","example":"uniswap_v3"}},"required":["contractAddress","chainId","price","source"]},"PriceHistoryResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440001"},"contractAddress":{"type":"string","example":"0x853d955aCEf822Db058eb8505911ED77F175b99e"},"chainId":{"type":"number","example":137},"price":{"type":"number","example":1.25},"priceUsd":{"type":"object","example":1.25},"liquidity":{"type":"object","example":"{\"pool\": \"0x123...\", \"amount\": \"1000000\"}"},"volume24h":{"type":"object","example":50000.5},"priceChange24h":{"type":"object","example":5.2},"high24h":{"type":"object","example":1.3},"low24h":{"type":"object","example":1.2},"timestamp":{"format":"date-time","type":"string","example":"2025-01-15T10:30:00Z"},"source":{"type":"string","example":"uniswap_v3"},"createdAt":{"format":"date-time","type":"string","example":"2025-01-15T10:30:05Z"}},"required":["id","contractAddress","chainId","price","timestamp","source","createdAt"]},"TokenStats24hDto":{"type":"object","properties":{"currentPrice":{"type":"object","example":1.25},"priceChange24h":{"type":"object","example":5.2},"high24h":{"type":"object","example":1.3},"low24h":{"type":"object","example":1.2},"volume24h":{"type":"object","example":50000.5}}},"TransactionResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440001"},"chainId":{"type":"number","example":137},"txHash":{"type":"string","example":"0x456def..."},"contractId":{"type":"object","example":"550e8400-e29b-41d4-a716-446655440002"},"type":{"type":"string","example":"MINT","enum":["DEPLOY","MINT","TRANSFER","BURN","APPROVE","OTHER"]},"status":{"type":"string","example":"CONFIRMED","enum":["PENDING","CONFIRMED","FAILED"]},"blockNumber":{"type":"object","example":12346},"gasUsed":{"type":"object","example":"21000"},"gasPriceGwei":{"type":"object","example":"30.5"},"fromAddress":{"type":"string","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"},"toAddress":{"type":"object","example":"0x853d955aCEf822Db058eb8505911ED77F175b99e"},"value":{"type":"object","example":"1000000000000000000"},"data":{"type":"object","example":{"recipient":"0x123...","tokenURI":"ipfs://..."}},"error":{"type":"object","example":null},"createdAt":{"format":"date-time","type":"string","example":"2025-01-15T10:30:00Z"},"confirmedAt":{"type":"object","example":"2025-01-15T10:30:05Z"}},"required":["id","chainId","txHash","type","status","fromAddress","createdAt"]},"ActivityListResponseDto":{"type":"object","properties":{"transactions":{"type":"array","items":{"$ref":"#/components/schemas/TransactionResponseDto"}},"total":{"type":"number","example":42},"limit":{"type":"number","example":20},"offset":{"type":"number","example":0}},"required":["transactions","total","limit","offset"]},"ActivityStatsResponseDto":{"type":"object","properties":{"totalTransactions":{"type":"number","example":150},"totalGasUsedWei":{"type":"string","example":"3150000"},"totalGasCostWei":{"type":"string","example":"94500000000000"},"transactionsByType":{"type":"object","example":{"MINT":50,"TRANSFER":80,"BURN":20}},"transactionsByStatus":{"type":"object","example":{"CONFIRMED":140,"PENDING":8,"FAILED":2}},"transactionsByChain":{"type":"array","example":[{"chainId":137,"count":100,"totalGasCost":"60000000000000"},{"chainId":1,"count":50,"totalGasCost":"34500000000000"}]}},"required":["totalTransactions","totalGasUsedWei","totalGasCostWei","transactionsByType","transactionsByStatus","transactionsByChain"]},"TokenBalanceDto":{"type":"object","properties":{}},"WithdrawTokenDto":{"type":"object","properties":{}},"WithdrawalResultDto":{"type":"object","properties":{}},"CreateCampaignDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID that owns this campaign"},"name":{"type":"string","description":"Campaign name"},"slug":{"type":"string","description":"URL-friendly slug"},"description":{"type":"string","description":"Campaign description"},"assetType":{"type":"string","description":"Asset type (UTILITY, SECURITY, DEFI)"},"pricePerToken":{"type":"number","description":"Price per token in smallest currency unit (e.g., pence)"},"totalSupply":{"type":"number","description":"Total supply of tokens"},"chainId":{"type":"number","description":"Blockchain chain ID"},"tokenSymbol":{"type":"string","description":"Token symbol"},"tokenName":{"type":"string","description":"Token name"},"benefits":{"description":"List of benefits","type":"array","items":{"type":"string"}},"images":{"description":"List of image URLs","type":"array","items":{"type":"string"}},"startDate":{"format":"date-time","type":"string","description":"Campaign start date"},"endDate":{"format":"date-time","type":"string","description":"Campaign end date"},"metadata":{"type":"object","description":"Additional metadata"},"distributionModel":{"type":"string","description":"Distribution model (e.g., \"fixed\")"},"status":{"type":"string","description":"Initial campaign status"},"currency":{"type":"string","description":"Currency code (USD, GBP, EUR)"},"pledgeEnabled":{"type":"boolean","description":"Enable PLEDGE subscriptions"},"pledgeAmount":{"type":"number","description":"PLEDGE amount per period"},"pledgeCurrency":{"type":"string","description":"PLEDGE currency"},"pledgeDescription":{"type":"string","description":"PLEDGE description"},"passType":{"type":"string","description":"PASS type","enum":["DIGITAL_ASSET","PHYSICAL_EVENT"],"default":"DIGITAL_ASSET"},"athleteEventId":{"type":"string","description":"AthleteEvent ID — required when passType=PHYSICAL_EVENT"}},"required":["companyId","name","pricePerToken","totalSupply"]},"CreatePASSDto":{"type":"object","properties":{"name":{"type":"string","example":"Support John Smith","description":"Name of your PASS (e.g., \"Support [Your Name]\")"},"description":{"type":"string","example":"Get exclusive access to my training journey and behind-the-scenes content.","description":"What supporters get with your PASS"},"price":{"type":"number","example":22,"description":"Price per PASS in dollars (e.g., 22 = $22)"},"currency":{"type":"string","example":"USD","description":"Currency code (USD, GBP, EUR)"},"supply":{"type":"number","example":100,"description":"Total number of PASS tokens to create"},"benefits":{"example":["Exclusive updates","Behind-the-scenes content","Direct messaging access"],"description":"List of benefits for PASS holders","type":"array","items":{"type":"string"}},"imageUrl":{"type":"string","example":"https://example.com/image.jpg","description":"Image URL for the PASS card"},"pledgeEnabled":{"type":"boolean","example":true,"description":"Enable monthly pledge subscriptions"},"pledgeAmount":{"type":"number","example":5,"description":"Monthly pledge amount (if enabled)"},"pledgeDescription":{"type":"string","example":"Monthly support for training expenses","description":"Description of what the pledge supports"}},"required":["name","price","benefits"]},"UpdateCampaignDto":{"type":"object","properties":{}},"PurchaseIntentDto":{"type":"object","properties":{"assetId":{"type":"string","description":"Asset/Campaign ID to purchase"},"tokenId":{"type":"string","description":"Token ID (alias for assetId)"},"userId":{"type":"string","description":"User ID (Clerk user ID) - extracted from auth if not provided"},"email":{"type":"string","description":"Customer email - extracted from auth if not provided"},"amountGbp":{"type":"number","description":"Amount in GBP - calculated from price if not provided"},"tokenCount":{"type":"number","description":"Number of tokens to purchase"},"quantity":{"type":"number","description":"Quantity (alias for tokenCount)"},"paymentMethod":{"type":"string","description":"Payment method (card, apple_pay, google_pay)"},"metadata":{"type":"object","description":"Additional metadata"}},"required":["assetId","tokenId","userId","email","amountGbp","tokenCount","quantity"]},"FeeCalculationResponseDto":{"type":"object","properties":{"feeUsd":{"type":"number","description":"Fee in USD"},"feePxl8l":{"type":"number","description":"Fee in PXL8L tokens"},"feePercentage":{"type":"number","description":"Fee percentage"},"assetValueUsd":{"type":"number","description":"Asset value used for calculation"}},"required":["feeUsd","feePxl8l","feePercentage","assetValueUsd"]},"ApprovalStatusResponseDto":{"type":"object","properties":{"isApproved":{"type":"boolean","description":"Whether company has approved platform to spend PXL8L"},"currentAllowance":{"type":"string","description":"Current allowance in PXL8L"},"requiredAmount":{"type":"number","description":"Required amount in PXL8L"},"spenderAddress":{"type":"string","description":"Platform spender address (for approval in frontend)"},"tokenAddress":{"type":"string","description":"PXL8L token address on this chain"}},"required":["isApproved","currentAllowance","requiredAmount","spenderAddress","tokenAddress"]},"CollectFeeRequestDto":{"type":"object","properties":{"fromWallet":{"type":"string","description":"Company wallet address","example":"0x1234..."},"assetValueUsd":{"type":"number","description":"Asset value in USD","example":100000},"chainId":{"type":"number","description":"Chain ID","example":137},"assetId":{"type":"string","description":"Optional asset ID for reference"}},"required":["fromWallet","assetValueUsd","chainId"]},"CreateListingDto":{"type":"object","properties":{"tokenId":{"type":"string","description":"Token ID to list for sale"},"price":{"type":"number","description":"Listing price in currency units (e.g., 25.00)","example":25}},"required":["tokenId","price"]},"TransferTokenDto":{"type":"object","properties":{"tokenId":{"type":"string","description":"Single token ID to transfer"},"tokenIds":{"description":"Multiple token IDs for batch transfer (max 50)","type":"array","items":{"type":"string"}},"recipientEmail":{"type":"string","description":"Recipient email address"}},"required":["recipientEmail"]},"ProposalOptionDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique option ID","example":"option1"},"label":{"type":"string","description":"Display label for the option","example":"Option A"},"metadata":{"type":"object","description":"Optional metadata for the option"}},"required":["id","label"]},"CreateProposalDto":{"type":"object","properties":{"title":{"type":"string","description":"Proposal title","example":"Next Training Camp Location"},"description":{"type":"string","description":"Proposal description"},"proposalType":{"type":"string","enum":["POLL","BINARY","PASS"],"description":"Type of proposal"},"campaignId":{"type":"string","description":"Campaign ID for token-scoped proposals (null = company-wide)"},"options":{"description":"Voting options (auto-generated for BINARY/PASS if not provided)","type":"array","items":{"$ref":"#/components/schemas/ProposalOptionDto"}},"votingStartsAt":{"type":"string","description":"When voting starts (ISO 8601 format)"},"votingEndsAt":{"type":"string","description":"When voting ends (ISO 8601 format)"},"minTokensToVote":{"type":"number","description":"Minimum tokens required to vote","default":1,"minimum":1},"tenureBonusEnabled":{"type":"boolean","description":"Enable tenure bonus for long-term holders","default":true},"tenureBonusPercent":{"type":"number","description":"Tenure bonus percentage per month (capped at 5 months)","default":10,"minimum":0,"maximum":50},"fightPollPriceCents":{"type":"number","description":"Fight Poll: price per vote in cents (e.g. 10000 = $100). When set, total pot = votes × price."},"fightPollCurrency":{"type":"string","description":"Fight Poll: currency (default USD)","default":"USD"}},"required":["title","proposalType"]},"VoteResultDto":{"type":"object","properties":{"optionId":{"type":"string"},"label":{"type":"string"},"voteCount":{"type":"number"},"votingPower":{"type":"number"}},"required":["optionId","label","voteCount","votingPower"]},"ProposalResponseDto":{"type":"object","properties":{"id":{"type":"string"},"companyId":{"type":"string"},"campaignId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"proposalType":{"type":"string","enum":["POLL","BINARY","PASS"]},"options":{"type":"array","items":{"$ref":"#/components/schemas/ProposalOptionDto"}},"minTokensToVote":{"type":"number"},"tenureBonusEnabled":{"type":"boolean"},"tenureBonusPercent":{"type":"number"},"status":{"type":"string","enum":["DRAFT","ACTIVE","CLOSED","EXECUTED","CANCELLED"]},"votingStartsAt":{"type":"string"},"votingEndsAt":{"type":"string"},"winningOptionId":{"type":"string"},"totalVotes":{"type":"number"},"totalVotingPower":{"type":"number"},"createdBy":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"isCompanyLevel":{"type":"boolean","description":"Is this a company-level or token-level proposal"},"results":{"description":"Vote results (if available)","type":"array","items":{"$ref":"#/components/schemas/VoteResultDto"}},"fightPollPriceCents":{"type":"number","description":"Fight Poll: price per vote in cents"},"fightPollCurrency":{"type":"string","description":"Fight Poll: currency"},"fightPollPotCents":{"type":"number","description":"Fight Poll: total pot value in cents (votes × price)"}},"required":["id","companyId","title","proposalType","options","minTokensToVote","tenureBonusEnabled","tenureBonusPercent","status","totalVotes","totalVotingPower","createdBy","createdAt","updatedAt"]},"UpdateProposalDto":{"type":"object","properties":{"title":{"type":"string","description":"Proposal title"},"description":{"type":"string","description":"Proposal description"},"options":{"description":"Voting options","type":"array","items":{"$ref":"#/components/schemas/ProposalOptionDto"}},"votingStartsAt":{"type":"string","description":"When voting starts"},"votingEndsAt":{"type":"string","description":"When voting ends"},"minTokensToVote":{"type":"number","description":"Minimum tokens required to vote"},"tenureBonusEnabled":{"type":"boolean","description":"Enable tenure bonus"},"tenureBonusPercent":{"type":"number","description":"Tenure bonus percentage per month"}}},"ActivateProposalResponseDto":{"type":"object","properties":{"proposal":{"$ref":"#/components/schemas/ProposalResponseDto"},"eligibleVotersCount":{"type":"number"}},"required":["proposal","eligibleVotersCount"]},"CloseProposalResponseDto":{"type":"object","properties":{"proposal":{"$ref":"#/components/schemas/ProposalResponseDto"},"results":{"type":"array","items":{"$ref":"#/components/schemas/VoteResultDto"}}},"required":["proposal","results"]},"CastVoteDto":{"type":"object","properties":{"optionId":{"type":"string","description":"Option ID to vote for","example":"option1"}},"required":["optionId"]},"VoteResponseDto":{"type":"object","properties":{"id":{"type":"string"},"proposalId":{"type":"string"},"optionId":{"type":"string"},"tokenCount":{"type":"number"},"tenureDays":{"type":"number"},"tenureBonus":{"type":"number"},"votingPower":{"type":"number"},"votedAt":{"type":"string"}},"required":["id","proposalId","optionId","tokenCount","tenureDays","tenureBonus","votingPower","votedAt"]},"EligibilityResponseDto":{"type":"object","properties":{"eligible":{"type":"boolean"},"reason":{"type":"string"},"tokenCount":{"type":"number"},"votingPower":{"type":"number"},"tenureBonus":{"type":"number"},"hasVoted":{"type":"boolean"}},"required":["eligible","tokenCount","votingPower","tenureBonus","hasVoted"]},"GetUploadUrlDto":{"type":"object","properties":{}},"ConfirmUploadDto":{"type":"object","properties":{}},"GetThumbnailUploadUrlDto":{"type":"object","properties":{}},"ConfirmThumbnailUploadDto":{"type":"object","properties":{}},"CreateTextPostDto":{"type":"object","properties":{}},"UpdateContentDto":{"type":"object","properties":{}},"PinContentDto":{"type":"object","properties":{}},"ReactToContentDto":{"type":"object","properties":{}},"AddCommentDto":{"type":"object","properties":{}},"StartStreamDto":{"type":"object","properties":{}},"SaveRecordingDto":{"type":"object","properties":{}},"PartnerMintDto":{"type":"object","properties":{"campaignId":{"type":"string","description":"Campaign ID (UUID) or slug"},"recipientEmail":{"type":"string","description":"Recipient email address"},"recipientName":{"type":"string","description":"Recipient display name"},"externalOrderId":{"type":"string","description":"External order ID for idempotency (prevents double-mint)"},"quantity":{"type":"number","description":"Number of tokens to mint (default: 1)"},"metadata":{"type":"object","description":"Optional metadata to store on the token"}},"required":["campaignId","recipientEmail"]},"CreateAthleteEventDto":{"type":"object","properties":{"campaignId":{"type":"string","description":"Campaign (PASS) ID"},"title":{"type":"string","description":"Event title","maxLength":255},"description":{"type":"string","description":"Event description"},"eventType":{"type":"string","enum":["FIGHT","SPARRING","TRAINING","APPEARANCE","MEET_AND_GREET","FUNDRAISER","STREAM","OTHER"],"description":"Type of event"},"eventDate":{"type":"string","description":"Event date/time (ISO 8601)"},"endDate":{"type":"string","description":"Event end date/time (ISO 8601)"},"location":{"type":"string","description":"Event location (city, state, country)","maxLength":500},"venue":{"type":"string","description":"Venue name","maxLength":255},"ticketUrl":{"type":"string","description":"External ticket or access URL"},"imageUrl":{"type":"string","description":"Event image URL"},"opponentName":{"type":"string","description":"Opponent name (for FIGHT events)"}},"required":["campaignId","title","eventType","eventDate"]},"UpdateAthleteEventDto":{"type":"object","properties":{"title":{"type":"string","description":"Event title","maxLength":255},"description":{"type":"string","description":"Event description"},"eventType":{"type":"string","enum":["FIGHT","SPARRING","TRAINING","APPEARANCE","MEET_AND_GREET","FUNDRAISER","STREAM","OTHER"],"description":"Type of event"},"eventDate":{"type":"string","description":"Event date/time (ISO 8601)"},"endDate":{"type":"string","description":"Event end date/time (ISO 8601)"},"location":{"type":"string","description":"Event location","maxLength":500},"venue":{"type":"string","description":"Venue name","maxLength":255},"ticketUrl":{"type":"string","description":"External ticket or access URL"},"imageUrl":{"type":"string","description":"Event image URL"},"opponentName":{"type":"string","description":"Opponent name (for FIGHT events)"}}},"CreateFightRecordDto":{"type":"object","properties":{}},"UpdateFightRecordDto":{"type":"object","properties":{}},"CreateProfileDto":{"type":"object","properties":{}},"UpdateProfileDto":{"type":"object","properties":{}},"CreateAssetDto":{"type":"object","properties":{"companyId":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string"},"tokenName":{"type":"string"},"tokenSymbol":{"type":"string"},"totalSupply":{"type":"number"},"pricePerToken":{"type":"number"},"assetType":{"type":"string"},"estimatedValue":{"type":"number"},"metadata":{"type":"object"}},"required":["companyId","name","tokenName","tokenSymbol","totalSupply","pricePerToken"]},"UpdateAssetDto":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string"},"pricePerToken":{"type":"number"},"metadata":{"type":"object"}}},"ApproveAssetDto":{"type":"object","properties":{"approvedBy":{"type":"string","description":"Admin user ID who approved the asset"},"notes":{"type":"string","description":"Notes about the approval"}}},"RejectAssetDto":{"type":"object","properties":{"reason":{"type":"string","description":"Reason for rejection"},"rejectedBy":{"type":"string","description":"Admin user ID who rejected the asset"},"notes":{"type":"string","description":"Additional notes about the rejection"}},"required":["reason"]},"ChangeStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["DRAFT","ACTIVE","PAUSED","COMPLETED","ARCHIVED","INACTIVE"],"description":"New status for the asset","example":"ACTIVE"},"reason":{"type":"string","description":"Reason for status change"},"changedBy":{"type":"string","description":"Admin user ID who changed the status"}},"required":["status"]},"TriggerDto":{"type":"object","properties":{"name":{"type":"string","description":"Trigger name"},"description":{"type":"string","description":"Trigger description"},"triggerType":{"type":"string","enum":["ACTIVATION","MILESTONE","PAYOUT"],"description":"Trigger type"}},"required":["name","triggerType"]},"CreateRewardCommitmentDto":{"type":"object","properties":{"companyId":{"type":"string","description":"Company ID"},"campaignId":{"type":"string","description":"Campaign ID"},"rate":{"type":"number","description":"Reward rate percentage (0-100)"},"rateType":{"type":"string","enum":["NET_EARNINGS","GROSS_REVENUE","PROFIT"],"description":"Rate type"},"duration":{"type":"number","description":"Duration value"},"durationUnit":{"type":"string","enum":["YEARS","MONTHS","PERPETUAL"],"description":"Duration unit"},"cap":{"type":"number","description":"Cap value (multiplier or fixed amount)"},"capType":{"type":"string","enum":["MULTIPLIER","FIXED_AMOUNT","NONE"],"description":"Cap type"},"subscriptionRequired":{"type":"boolean","description":"Whether subscription is required for rewards"},"subscriptionPrice":{"type":"number","description":"Monthly subscription price"},"triggers":{"description":"List of triggers","type":"array","items":{"$ref":"#/components/schemas/TriggerDto"}},"metadata":{"type":"object","description":"Additional metadata"}},"required":["companyId","campaignId","rate","rateType","duration","durationUnit","capType","subscriptionRequired","triggers"]},"UpdateRewardCommitmentDto":{"type":"object","properties":{"subscriptionRequired":{"type":"boolean","description":"Whether subscription is required"},"subscriptionPrice":{"type":"number","description":"Monthly subscription price"},"metadata":{"type":"object","description":"Additional metadata"}}},"SubmitTriggerDto":{"type":"object","properties":{"evidenceUrl":{"type":"string","description":"URL to evidence supporting achievement"}}},"VerifyTriggerDto":{"type":"object","properties":{"verifiedBy":{"type":"string","description":"Admin user ID performing verification"},"approved":{"type":"boolean","description":"Whether to approve the trigger"},"rejectionReason":{"type":"string","description":"Reason for rejection (required if not approved)"}},"required":["verifiedBy","approved"]}}}}