{"openapi":"3.0.0","paths":{"/api/send-transaction":{"post":{"operationId":"AppController_sendTransaction","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"transaction":{"type":"string","description":"Base64 encoded signed transaction to send","example":"eyJ0eXBlIjoiVFJBTlNBQ1RJT04iLCJhY3Rpb24iOiJTRU5EIn0="}}}}}},"responses":{"200":{"description":"Transaction sent successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTransactionResponse"}}}},"400":{"description":"Bad request - Missing transaction"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Send a signed transaction to the blockchain","tags":["General"]}},"/api/get-price":{"get":{"operationId":"AppController_getTokenPriceInSolana","parameters":[{"name":"tokenAddress","required":true,"in":"query","description":"Solana address of the token to get price for","schema":{"example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU","type":"string"}}],"responses":{"200":{"description":"Returns the token price in SOL","content":{"application/json":{"schema":{"type":"object","properties":{"price":{"type":"number","description":"Price of the token in SOL","example":1.5}}}}}},"500":{"description":"Internal server error"}},"summary":"Get token price in SOL","tags":["General"]}},"/api/currency-list":{"get":{"operationId":"AppController_getSupportedCurrencyList","parameters":[],"responses":{"200":{"description":"Returns list of supported currencies with their details","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","description":"Solana address of the currency","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"symbol":{"type":"string","description":"Currency symbol","example":"USDC"},"name":{"type":"string","description":"Currency name","example":"USD Coin"},"decimals":{"type":"number","description":"Number of decimal places","example":6}}}}}}},"500":{"description":"Internal server error"}},"summary":"Get list of supported currencies","tags":["General"]}},"/api/offers":{"post":{"operationId":"OfferController_createOffer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceOfferArgs"}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and offer receipt address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferTransactionResponse"}}}},"403":{"description":"Unauthorized - Must be the buyer"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Create a new offer for an NFT","tags":["Offers"]}},"/api/offers/cancel":{"post":{"operationId":"OfferController_cancelOffer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelOfferArgs"}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and offer receipt address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferTransactionResponse"}}}},"403":{"description":"Unauthorized - Must be the buyer"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Cancel an existing offer","tags":["Offers"]}},"/api/offers/{receiptAddress}":{"get":{"operationId":"OfferController_getOfferByReceiptAddress","parameters":[{"name":"receiptAddress","required":true,"in":"path","description":"Solana address of the offer receipt","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns the offer details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferModel"}}}},"500":{"description":"Internal server error"}},"summary":"Get offer by receipt address","tags":["Offers"]}},"/api/offers/asset/{assetAddress}":{"get":{"operationId":"OfferController_getOffersByNft","parameters":[{"name":"assetAddress","required":true,"in":"path","description":"Solana address of the NFT asset","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns list of offers for the NFT","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OfferModel"}}}}},"500":{"description":"Internal server error"}},"summary":"Get all offers for a specific NFT","tags":["Offers"]}},"/api/offers/buyer/{buyerAddress}":{"get":{"operationId":"OfferController_getOffersByBuyer","parameters":[{"name":"buyerAddress","required":true,"in":"path","description":"Solana address of the buyer","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns list of offers made by the buyer","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OfferModel"}}}}},"500":{"description":"Internal server error"}},"summary":"Get all offers made by a specific buyer","tags":["Offers"]}},"/api/offers/{id}/seen":{"put":{"operationId":"OfferController_markOfferAsSeen","parameters":[{"name":"id","required":true,"in":"path","description":"Offer ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Offer marked as seen successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferModel"}}}},"500":{"description":"Internal server error"}},"summary":"Mark an offer as seen","tags":["Offers"]}},"/api/offers/my/{userAddress}":{"get":{"operationId":"OfferController_findMyOffers","parameters":[{"name":"userAddress","required":true,"in":"path","description":"Solana address of the authenticated user","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns list of offers made by the user","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OfferModel"}}}}},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Get all offers made by the authenticated user","tags":["Offers"]}},"/api/offers/received/{userAddress}":{"get":{"operationId":"OfferController_findReceivedOffers","parameters":[{"name":"userAddress","required":true,"in":"path","description":"Solana address of the authenticated user","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns list of offers received by the user","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OfferModel"}}}}},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Get all offers received by the authenticated user","tags":["Offers"]}},"/api/offers/accept":{"post":{"operationId":"OfferController_acceptOffer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptOfferArgs"}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and NFT asset address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTransactionResponse"}}}},"403":{"description":"Unauthorized - Must be the seller"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Accept an offer","tags":["Offers"]}},"/api/asset/create":{"post":{"operationId":"AssetController_createAsset","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Asset image file (required)"},"name":{"type":"string","description":"Name of the asset"},"creator":{"type":"string","description":"Solana address of the creator"},"collectionAddress":{"type":"string","description":"Solana address of the collection"},"description":{"type":"string","description":"Description of the asset"},"payer":{"type":"string","description":"Solana address of the payer (defaults to creator if not provided)"}}}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and asset address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTransactionResponse"}}}},"400":{"description":"Bad request - Missing required fields"},"403":{"description":"Unauthorized - Must be the creator"},"422":{"description":"Unprocessable entity - Invalid file type"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Create a new NFT asset","tags":["Assets"]}},"/api/asset/burn":{"post":{"operationId":"AssetController_burnAsset","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assetAddress":{"type":"string","description":"Solana address of the asset to burn"},"payer":{"type":"string","description":"Solana address of the payer"},"collectionAddress":{"type":"string","description":"Solana address of the collection"}}}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and asset address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTransactionResponse"}}}},"400":{"description":"Bad request - Missing required fields"},"403":{"description":"Unauthorized - Must be the payer"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Burn an NFT asset","tags":["Assets"]}},"/api/asset/transfer":{"post":{"operationId":"AssetController_transferAsset","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assetAddress":{"type":"string","description":"Solana address of the asset to transfer"},"currentOwner":{"type":"string","description":"Solana address of the current owner"},"newOwner":{"type":"string","description":"Solana address of the new owner"},"collectionAddress":{"type":"string","description":"Solana address of the collection"}}}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and asset address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTransactionResponse"}}}},"400":{"description":"Bad request - Missing required fields"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Transfer an NFT asset to a new owner","tags":["Assets"]}},"/api/asset/for-sale":{"post":{"operationId":"AssetController_setAssetForSale","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assetAddress":{"type":"string","description":"Solana address of the asset to list"},"price":{"type":"number","description":"Price of the asset"},"owner":{"type":"string","description":"Solana address of the current owner"},"currencyAddress":{"type":"string","description":"Solana address of the currency token"},"collectionAddress":{"type":"string","description":"Solana address of the collection"}}}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and asset address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTransactionResponse"}}}},"400":{"description":"Bad request - Missing required fields"},"403":{"description":"Unauthorized - Must be the owner"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"List an NFT asset for sale","tags":["Assets"]}},"/api/asset/cancel-for-sale":{"post":{"operationId":"AssetController_cancelForSale","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assetAddress":{"type":"string","description":"Solana address of the listed asset"},"owner":{"type":"string","description":"Solana address of the current owner"},"collectionAddress":{"type":"string","description":"Solana address of the collection"}}}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and asset address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTransactionResponse"}}}},"400":{"description":"Bad request - Missing required fields"},"403":{"description":"Unauthorized - Must be the owner"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Cancel a listed NFT asset","tags":["Assets"]}},"/api/asset/{assetAddress}":{"get":{"operationId":"AssetController_fetchAsset","parameters":[{"name":"assetAddress","required":true,"in":"path","description":"Solana address of the asset","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns the asset details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetModel"}}}},"400":{"description":"Bad request - Missing asset address"},"500":{"description":"Internal server error"}},"summary":"Get asset details by address","tags":["Assets"]}},"/api/asset/{assetAddress}/owner":{"get":{"operationId":"AssetController_getAssetOwner","parameters":[{"name":"assetAddress","required":true,"in":"path","description":"Solana address of the asset","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns the current owner address"},"500":{"description":"Internal server error"}},"summary":"Get current owner of an asset","tags":["Assets"]}},"/api/asset/owner/{ownerAddress}":{"get":{"operationId":"AssetController_getAssetsbyOwner","parameters":[{"name":"ownerAddress","required":true,"in":"path","description":"Solana address of the owner","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns list of assets owned by the address","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetModel"}}}}},"400":{"description":"Bad request - Missing owner address"},"500":{"description":"Internal server error"}},"summary":"Get all assets owned by an address","tags":["Assets"]}},"/api/asset/favorites/{userAddress}":{"get":{"operationId":"AssetController_getFavoriteAssets","parameters":[{"name":"userAddress","required":true,"in":"path","description":"Solana address of the user","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns list of favorite assets","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetModel"}}}}},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Get favorite assets of a user","tags":["Assets"]}},"/api/asset/accept-sale":{"post":{"operationId":"AssetController_acceptSale","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"asset":{"type":"string","description":"Solana address of the asset to buy"},"buyer":{"type":"string","description":"Solana address of the buyer"}}}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and asset address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTransactionResponse"}}}},"400":{"description":"Bad request - Missing required fields"},"403":{"description":"Unauthorized - Must be the buyer"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Accept a sale of an NFT asset","tags":["Assets"]}},"/api/asset/{assetAddress}/activities":{"get":{"operationId":"AssetController_getAssetActivities","parameters":[{"name":"assetAddress","required":true,"in":"path","description":"Solana address of the asset","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns list of activities for the asset"},"500":{"description":"Internal server error"}},"summary":"Get activity history of an asset","tags":["Assets"]}},"/api/collection/{collectionAddress}":{"get":{"operationId":"CollectionController_fetchCollection","parameters":[{"name":"collectionAddress","required":true,"in":"path","description":"Solana address of the collection","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns the collection details"},"500":{"description":"Internal server error"}},"summary":"Get collection by address","tags":["Collections"]},"put":{"operationId":"CollectionController_updateCollection","parameters":[{"name":"collectionAddress","required":true,"in":"path","description":"Solana address of the collection to update","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary","description":"New collection image file (optional)"},"banner":{"type":"string","format":"binary","description":"New collection banner image file (optional)"},"category":{"type":"string","description":"New category of the collection"},"description":{"type":"string","description":"New description of the collection"},"website":{"type":"string","description":"New website URL"},"twitter":{"type":"string","description":"New Twitter handle"},"telegram":{"type":"string","description":"New Telegram link"},"instagram":{"type":"string","description":"New Instagram handle"},"discord":{"type":"string","description":"New Discord server link"},"youtube":{"type":"string","description":"New YouTube channel link"}}}}}},"responses":{"200":{"description":"Collection updated successfully"},"400":{"description":"Bad request - Missing collection address"},"403":{"description":"Unauthorized - Must be the collection owner"},"422":{"description":"Unprocessable entity - Invalid file type"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Update an existing collection","tags":["Collections"]}},"/api/collection/create":{"post":{"operationId":"CollectionController_createCollection","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary","description":"Collection image file (required)"},"banner":{"type":"string","format":"binary","description":"Collection banner image file (optional)"},"creator":{"type":"string","description":"Solana address of the collection creator"},"collectionName":{"type":"string","description":"Name of the collection"},"category":{"type":"string","description":"Category of the collection"},"payer":{"type":"string","description":"Solana address of the payer (defaults to creator if not provided)"},"description":{"type":"string","description":"Description of the collection"},"creatorName":{"type":"string","description":"Name of the creator"},"website":{"type":"string","description":"Website URL"},"twitter":{"type":"string","description":"Twitter handle"},"telegram":{"type":"string","description":"Telegram link"},"instagram":{"type":"string","description":"Instagram handle"},"discord":{"type":"string","description":"Discord server link"},"youtube":{"type":"string","description":"YouTube channel link"},"maxSize":{"type":"number","description":"Maximum size of the collection"},"sellerFee":{"type":"string","description":"Seller fee in basis points"},"totalSupply":{"type":"string","description":"Total supply of NFTs in the collection"}}}}}},"responses":{"200":{"description":"Returns base64 encoded transaction to sign and collection address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionTransactionResponse"}}}},"400":{"description":"Bad request - Missing required fields"},"403":{"description":"Unauthorized - Must be the creator or payer"},"422":{"description":"Unprocessable entity - Invalid file type"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Create a new NFT collection","tags":["Collections"]}},"/api/collection/{collectionAddress}/detailed-info":{"get":{"operationId":"CollectionController_fetchFullCollectionInfo","parameters":[{"name":"collectionAddress","required":true,"in":"path","description":"Solana address of the collection","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns detailed collection information"},"500":{"description":"Internal server error"}},"summary":"Get detailed information about a collection","tags":["Collections"]}},"/api/collection/creator/{userAddress}":{"get":{"operationId":"CollectionController_getCollectionsByCreator","parameters":[{"name":"userAddress","required":true,"in":"path","description":"Solana address of the creator","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns list of collections created by the user"},"500":{"description":"Internal server error"}},"summary":"Get all collections created by a specific user","tags":["Collections"]}},"/api/collection/all":{"post":{"operationId":"CollectionController_getAllCollections","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetAllCollectionsArgs"}}}},"responses":{"200":{"description":"Returns list of collections matching the filter criteria"},"500":{"description":"Internal server error"}},"summary":"Get all collections with optional filtering","tags":["Collections"]}},"/api/user/{userAddress}":{"get":{"operationId":"UserController_fetchCollection","parameters":[{"name":"userAddress","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns user profile","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserModel"}}}},"500":{"description":"Internal server error"}},"summary":"Get user profile by address","tags":["User"]},"put":{"operationId":"UserController_updateUser","parameters":[{"name":"userAddress","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"User name"},"bio":{"type":"string","description":"User biography"},"website":{"type":"string","description":"User website URL"},"twitter":{"type":"string","description":"Twitter handle"},"telegram":{"type":"string","description":"Telegram username"},"instagram":{"type":"string","description":"Instagram handle"},"discord":{"type":"string","description":"Discord username"},"youtube":{"type":"string","description":"YouTube channel"},"avatar":{"type":"string","format":"binary","description":"User avatar image"},"banner":{"type":"string","format":"binary","description":"User banner image"}}}}}},"responses":{"200":{"description":"Profile updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserModel"}}}},"400":{"description":"Bad request - Invalid input or unauthorized"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Update user profile","tags":["User"]}},"/api/user/{userAddress}/accept-agreement":{"post":{"operationId":"UserController_acceptAgreement","parameters":[{"name":"userAddress","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agreement":{"type":"boolean","description":"Agreement acceptance status"}}}}}},"responses":{"200":{"description":"Agreement accepted successfully"},"400":{"description":"Bad request - Invalid input or unauthorized"}},"security":[{"bearer":[]}],"summary":"Accept user agreement","tags":["User"]}},"/api/user/{userAddress}/toggle-favorite-collection":{"post":{"operationId":"UserController_favoriteCollection","parameters":[{"name":"userAddress","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"collectionAddress":{"type":"string","description":"Collection address to toggle"}}}}}},"responses":{"200":{"description":"Favorite collection toggled successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserModel"}}}},"400":{"description":"Bad request - Invalid input or unauthorized"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Toggle favorite collection","tags":["User"]}},"/api/user/{userAddress}/toggle-favorite-asset":{"post":{"operationId":"UserController_favoriteAsset","parameters":[{"name":"userAddress","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assetAddress":{"type":"string","description":"Asset address to toggle"}}}}}},"responses":{"200":{"description":"Favorite asset toggled successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserModel"}}}},"400":{"description":"Bad request - Invalid input or unauthorized"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Toggle favorite asset","tags":["User"]}},"/api/user/{userAddress}/balance":{"post":{"operationId":"UserController_getUserBalance","parameters":[{"name":"userAddress","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tokenAddress":{"type":"string","description":"Token address to check balance"}}}}}},"responses":{"200":{"description":"Returns user token balance"},"400":{"description":"Bad request - Invalid input"},"500":{"description":"Internal server error"}},"summary":"Get user token balance","tags":["User"]}},"/api/user/{userAddress}/trades":{"get":{"operationId":"UserController_getUserTrades","parameters":[{"name":"userAddress","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns user trade history"},"400":{"description":"Bad request - Invalid input or unauthorized"},"500":{"description":"Internal server error"}},"security":[{"bearer":[]}],"summary":"Get user trade history","tags":["User"]}},"/api/auth/signIn":{"post":{"operationId":"AuthController_signIn","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userAddress":{"type":"string","description":"Solana address of the user","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"signature":{"type":"string","description":"Signature of the auth message signed by the user's wallet","example":"2UzGCZxHosKL7K4Zq3J9NKJf2T2WtFbG6qRJzpqdRzS8nJgFzLdKQmW3XqY5N2vBmKcRzT9yLpV7xHjM4nQ8"}},"required":["userAddress","signature"]}}}},"responses":{"200":{"description":"Successfully authenticated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthToken"}}}},"403":{"description":"Authentication failed","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Failed to sign in"},"error":{"type":"string","example":"Invalid signature"}}}}}}},"summary":"Sign in with wallet signature","tags":["Authentication"]}},"/api/auth/messageToSign":{"post":{"operationId":"AuthController_authWithWallet","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userAddress":{"type":"string","description":"Solana address of the user requesting authentication","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"}},"required":["userAddress"]}}}},"responses":{"200":{"description":"Returns message to sign and nonce","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignInMessage"}}}},"400":{"description":"Failed to generate auth message","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Failed to generate auth message"},"error":{"type":"string","example":"Invalid user address"}}}}}}},"summary":"Get message to sign for authentication","tags":["Authentication"]}}},"info":{"title":"Opincur NFT Marketplace API","description":"\n      Comprehensive API for managing NFTs, collections, offers, and user interactions on the Opincur platform.\n      \n      Key Features:\n      - User Management: Profile creation, social links, favorites, and trade history\n      - Asset Operations: Create, burn, transfer, list, and manage NFT assets\n      - Offer System: Create, accept, cancel, and manage NFT offers\n      - Collection Management: Create and manage NFT collections\n      - Authentication: Secure wallet-based authentication\n      \n      Authentication:\n      - All protected endpoints require a valid JWT token\n      - Token can be obtained through wallet signature verification\n      \n      Rate Limiting:\n      - Most endpoints are rate limited for stability\n      - Standard limits: 5 requests per minute for write operations\n      - Higher limits: 20 requests per minute for read operations\n      \n      Transaction Flow:\n      - Write operations return base64 encoded transactions\n      - Transactions must be signed client-side before submission\n      - Use the /api/send-transaction endpoint to submit signed transactions\n    ","version":"1.0","contact":{}},"tags":[{"name":"Authentication","description":"Wallet-based authentication endpoints"},{"name":"User","description":"User profile and preferences management"},{"name":"Assets","description":"NFT asset creation and management"},{"name":"Offers","description":"NFT offer creation and management"},{"name":"Collections","description":"NFT collection management"},{"name":"General","description":"General utility endpoints"}],"servers":[],"components":{"securitySchemes":{"JWT-auth":{"scheme":"bearer","bearerFormat":"JWT","type":"http","name":"JWT","description":"Enter JWT token","in":"header"}},"schemas":{"SendTransactionResponse":{"type":"object","properties":{"signature":{"type":"string","description":"Signature of the submitted transaction on the Solana blockchain","example":"5K3v...abc"},"status":{"type":"string","description":"Status of the transaction after submission (e.g., confirmed)","example":"confirmed"}},"required":["signature","status"]},"PlaceOfferArgs":{"type":"object","properties":{"assetAddress":{"type":"string","description":"NFT asset address"},"price":{"type":"number","description":"Offer price"},"currencyAddress":{"type":"string","description":"Currency address for payment"},"currencySymbol":{"type":"string","description":"Currency symbol"},"buyer":{"type":"string","description":"Buyer wallet address"},"collectionAddress":{"type":"string","description":"Collection address"},"receiptAddress":{"type":"string","description":"Offer receipt address"}},"required":["assetAddress","price","currencyAddress","currencySymbol","buyer"]},"OfferTransactionResponse":{"type":"object","properties":{"transaction":{"type":"string","description":"Base64 encoded transaction that needs to be signed on the client side","example":"eyJ0eXBlIjoiT0ZGRVIiLCJhY3Rpb24iOiJDUkVBVEUifQ=="},"receiptAddress":{"type":"string","description":"Solana address of the offer receipt","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"}},"required":["transaction","receiptAddress"]},"CancelOfferArgs":{"type":"object","properties":{"assetAddress":{"type":"string","description":"NFT asset address"},"buyer":{"type":"string","description":"Buyer wallet address"},"currencyAddress":{"type":"string","description":"Currency address"}},"required":["assetAddress","buyer","currencyAddress"]},"AssetModel":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the asset"},"name":{"type":"string","description":"Name of the NFT asset","example":"CryptoPunk #1234"},"pictureId":{"type":"string","description":"ID of the asset picture"},"order":{"type":"number","description":"Order/sequence number of the asset","example":1},"description":{"type":"string","description":"Description of the NFT asset","example":"A unique digital collectible"},"imageUrl":{"type":"string","description":"URL of the asset image"},"mimeType":{"type":"string","description":"MIME type of the asset image","example":"image/png"},"thumbnailUrl":{"type":"string","description":"URL of the asset thumbnail"},"metaData":{"type":"string","description":"Metadata of the NFT in JSON format"},"collectionName":{"type":"string","description":"Name of the collection this asset belongs to"},"collectionId":{"type":"string","description":"ID of the collection"},"collectionPublicKey":{"type":"string","description":"Solana public key of the collection","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"authorPublicKey":{"type":"string","description":"Solana public key of the asset creator","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"publicKey":{"type":"string","description":"Solana public key of the asset","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"mintedAt":{"format":"date-time","type":"string","description":"Date when the asset was minted"},"createdAt":{"format":"date-time","type":"string","description":"Date when the asset was created"},"updatedAt":{"format":"date-time","type":"string","description":"Date when the asset was last updated"},"status":{"type":"string","description":"Current status of the asset","example":"LISTED"},"priceInSol":{"type":"number","description":"Current price in SOL","example":1.5},"price":{"type":"number","description":"Current price in the specified currency"},"currencySymbol":{"type":"string","description":"Symbol of the currency used for pricing","example":"USDC"},"currencyAddress":{"type":"string","description":"Solana address of the currency used for pricing","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"lastPrice":{"type":"number","description":"Last sale price in the specified currency"},"lastPriceSymbol":{"type":"string","description":"Symbol of the currency used for last sale","example":"USDC"},"lastPriceAddress":{"type":"string","description":"Solana address of the currency used for last sale","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"lastPriceInSol":{"type":"number","description":"Last sale price in SOL","example":1.2},"receiptAddress":{"type":"string","description":"Solana address of the offer receipt","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"viewsCount":{"type":"number","description":"Number of times the asset has been viewed","example":100},"tradesCount":{"type":"number","description":"Number of trades/transactions for this asset","example":5},"removed":{"type":"boolean","description":"Whether the asset has been removed","default":false},"currentOwnerAddress":{"type":"string","description":"Solana address of the current owner","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"currentOwnerAvatar":{"type":"string","description":"URL of the current owner avatar"},"type":{"type":"string","description":"Type of the asset","example":"NFT"}},"required":["name","order","createdAt","updatedAt","viewsCount","tradesCount","removed"]},"OfferModel":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the offer"},"nftAddress":{"type":"string","description":"NFT asset address"},"buyerAddress":{"type":"string","description":"Buyer wallet address"},"price":{"type":"number","description":"Offer price in the specified currency"},"priceInSol":{"type":"number","description":"Offer price converted to SOL"},"currencySymbol":{"type":"string","description":"Currency symbol (e.g., SOL, USDC)"},"currencyAddress":{"type":"string","description":"Currency contract address"},"version":{"type":"number","description":"Offer version number"},"metadataAddress":{"type":"string","description":"Metadata address for the offer"},"receiptAddress":{"type":"string","description":"Offer receipt address"},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp"},"seen":{"type":"boolean","description":"Whether the offer has been seen by the seller"},"cancelled":{"type":"boolean","description":"Whether the offer has been cancelled"},"cancelledAt":{"format":"date-time","type":"string","description":"Timestamp when the offer was cancelled"},"accepted":{"type":"boolean","description":"Whether the offer has been accepted"},"acceptedAt":{"format":"date-time","type":"string","description":"Timestamp when the offer was accepted"},"acceptedBy":{"type":"string","description":"Address of the user who accepted the offer"},"type":{"type":"string","description":"Type of the offer"},"thumbnailUrl":{"type":"string","description":"URL to NFT thumbnail image"},"nft":{"description":"Associated NFT details","allOf":[{"$ref":"#/components/schemas/AssetModel"}]}},"required":["id","nftAddress","buyerAddress","price","priceInSol","currencySymbol","currencyAddress","receiptAddress","createdAt","seen","cancelled","accepted"]},"AcceptOfferArgs":{"type":"object","properties":{"offerReceipt":{"type":"string","description":"Offer receipt address"},"seller":{"type":"string","description":"Seller wallet address"}},"required":["offerReceipt","seller"]},"AssetTransactionResponse":{"type":"object","properties":{"transaction":{"type":"string","description":"Base64 encoded transaction that needs to be signed on the client side","example":"eyJ0eXBlIjoiQVNTRVQiLCJhY3Rpb24iOiJUUkFOU0ZFUiJ9=="},"assetAddress":{"type":"string","description":"Solana address of the NFT asset","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"}},"required":["transaction","assetAddress"]},"CollectionTransactionResponse":{"type":"object","properties":{"transaction":{"type":"string","description":"Base64 encoded transaction that needs to be signed on the client side","example":"eyJ0eXBlIjoiQ09MTEVDVElPTiIsImFjdGlvbiI6IkNSRUFURSJ9=="},"collectionAddress":{"type":"string","description":"Solana address of the NFT collection","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"}},"required":["transaction","collectionAddress"]},"GetAllCollectionsArgs":{"type":"object","properties":{"category":{"type":"string","description":"Collection category"},"view":{"type":"string","description":"View type (e.g., favorites, portfolio)"},"userAddress":{"type":"string","description":"User wallet address"}}},"UserModel":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the user"},"publicKey":{"type":"string","description":"User wallet address"},"name":{"type":"string","description":"User display name"},"email":{"type":"string","description":"User email address"},"avatar":{"type":"string","description":"URL to user avatar image"},"bannerUrl":{"type":"string","description":"URL to user banner image"},"bio":{"type":"string","description":"User biography"},"website":{"type":"string","description":"User website URL"},"twitter":{"type":"string","description":"Twitter handle"},"instagram":{"type":"string","description":"Instagram handle"},"discord":{"type":"string","description":"Discord username"},"youtube":{"type":"string","description":"YouTube channel"},"telegram":{"type":"string","description":"Telegram username"},"createdAt":{"format":"date-time","type":"string","description":"User creation timestamp"},"updatedAt":{"format":"date-time","type":"string","description":"Last update timestamp"},"agreement":{"type":"boolean","description":"User agreement acceptance status"},"agreementAt":{"format":"date-time","type":"string","description":"Timestamp when user accepted the agreement"},"favoriteCollections":{"description":"List of favorite collection addresses","type":"array","items":{"type":"string"}},"favoriteAssets":{"description":"List of favorite asset addresses","type":"array","items":{"type":"string"}}},"required":["publicKey","createdAt","updatedAt","agreement","favoriteCollections","favoriteAssets"]},"AuthToken":{"type":"object","properties":{"accessToken":{"type":"string","description":"JWT token for authentication","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyQWRkcmVzcyI6IjB4MTIzIiwiZXhwIjoxNTE2MjM5MDIyfQ"},"userAddress":{"type":"string","description":"Solana address of the authenticated user","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"}},"required":["accessToken","userAddress"]},"SignInMessage":{"type":"object","properties":{"userAddress":{"type":"string","description":"Solana address of the user requesting authentication","example":"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"},"message":{"type":"string","description":"Message to be signed by the user for authentication","example":"Sign-in to opin.art with this your wallet: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU\n\nNonce: 123456"},"nonce":{"type":"number","description":"Nonce value to prevent replay attacks","example":123456}},"required":["userAddress","message","nonce"]}}}}