{"openapi":"3.1.0","info":{"version":"1.0.0","title":"OpenAPI"},"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API Bearer Token"}},"schemas":{},"parameters":{}},"paths":{"/v1/banners":{"get":{"tags":["Banner"],"summary":"Get banners list","operationId":"get_ListBanners","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"}],"responses":{"200":{"description":"Returns a list of banners","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"imageUrl":{"type":["string","null"]},"title":{"type":"string"},"description":{"type":"string"},"ctaUrl":{"type":["string","null"]},"ctaActionType":{"type":["string","null"]},"dismissible":{"type":"boolean"}},"required":["id","imageUrl","title","description","ctaUrl","ctaActionType","dismissible"]}}}}},"400":{"description":"Bad request - invalid user","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/launchpads":{"get":{"tags":["Launchpads"],"summary":"Get enabled launchpads (jup-studio first)","operationId":"get_ListLaunchpads","responses":{"200":{"description":"Returns sorted array of enabled launchpads","content":{"application/json":{"schema":{"type":"object","properties":{"launchpads":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"color":{"type":"string"},"bondingCurveSupported":{"type":"boolean"},"iconUrl":{"type":"string"},"href":{"type":"string"},"id":{"type":"string"}},"required":["label","color","bondingCurveSupported","iconUrl","id"]}}},"required":["launchpads"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/scan":{"post":{"tags":["Security"],"summary":"Scan site and optional transaction for security threats","operationId":"post_Scan","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"site":{"type":"string","minLength":1,"description":"Website to scan (URL or domain)"},"tx":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"},"minItems":1}],"description":"Base64-encoded Solana transaction(s) — single string or array (optional)"},"account":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (required when tx is provided)"},"enableSimulation":{"type":"boolean","default":true,"description":"Enable transaction simulation"}},"required":["site"]}}}},"responses":{"200":{"description":"Scan result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{"type":"string","enum":["MALICIOUS","NOT_MALICIOUS","UNKNOWN"]},"providerName":{"type":"string"},"simulation":{"type":"object","properties":{"status":{"type":"string","enum":["success","revert","error"],"description":"Simulation status"},"balanceChanges":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Token mint address"},"symbol":{"type":"string","description":"Token symbol"},"icon":{"type":"string","description":"Token icon URL"},"decimals":{"type":"number","description":"Token decimals"},"amount":{"type":"number","description":"Amount change (positive = receive, negative = send)"},"value":{"type":"number","description":"USD value of the change"}},"required":["id","symbol","decimals","amount","value"]}},"description":"Balance changes keyed by account address"},"networkFee":{"type":"object","properties":{"payer":{"type":"string","description":"Address paying the fee"},"amount":{"type":"number","description":"Fee amount in SOL"},"value":{"type":"number","description":"USD value of the fee"}},"required":["payer","amount","value"],"description":"Network fee details"},"error":{"type":"string","description":"Error message if simulation failed"}},"required":["status"],"description":"Transaction simulation result (only present when tx is provided)"}},"required":["result"]}}}},"400":{"description":"Bad request - validation error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/portfolio/explore":{"get":{"tags":["Portfolio"],"summary":"Get tokens for portfolio explore section","operationId":"get_PortfolioExploreTokens","responses":{"200":{"description":"Returns tokens and prices for the explore section","content":{"application/json":{"schema":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"logoUrl":{"type":["string","null"]},"decimals":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"launchpad":{"type":"string"},"stockId":{"type":"string"},"scaledUiMultiplier":{"type":"string"}},"required":["address","name","symbol","logoUrl","decimals","tags","scaledUiMultiplier"]}},"prices":{"type":"object","additionalProperties":{"type":"object","properties":{"price":{"type":["number","null"]},"priceChange24h":{"type":["number","null"]}},"required":["price","priceChange24h"]}}},"required":["tokens","prices"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/portfolio/holdings/{address}":{"get":{"tags":["Portfolio"],"summary":"Get token holdings for a wallet","operationId":"get_PortfolioHoldings","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"Wallet address (Solana)"},"required":true,"description":"Wallet address (Solana)","name":"address","in":"path"},{"schema":{"type":"string","description":"Comma-separated token account addresses to filter (max 5)"},"required":false,"description":"Comma-separated token account addresses to filter (max 5)","name":"tokenAccountAddresses","in":"query"},{"schema":{"type":"boolean","default":false,"description":"Fetch additional metadata for mints where all accounts have zero balance (default: false)"},"required":false,"description":"Fetch additional metadata for mints where all accounts have zero balance (default: false)","name":"includeEmptyAccountMetadata","in":"query"}],"responses":{"200":{"description":"Returns token holdings for the given wallet address and optionally filtered by token account addresses","content":{"application/json":{"schema":{"type":"object","properties":{"totalValue":{"type":"number"},"reclaimableCount":{"type":"number"},"tokens":{"type":"object","additionalProperties":{"type":"object","properties":{"address":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"logoUrl":{"type":["string","null"]},"decimals":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"launchpad":{"type":"string"},"stockId":{"type":"string"},"scaledUiMultiplier":{"type":"string"}},"required":["address","name","symbol","logoUrl","decimals","tags","scaledUiMultiplier"]}},"prices":{"type":"object","additionalProperties":{"type":"object","properties":{"price":{"type":["number","null"]},"priceChange24h":{"type":["number","null"]}},"required":["price","priceChange24h"]}},"holdings":{"type":"array","items":{"type":"object","properties":{"mint":{"type":"string"},"account":{"type":"string"},"amount":{"type":"string"},"decimals":{"type":"number"},"programId":{"type":"string"},"isFrozen":{"type":"boolean"},"isAssociatedTokenAccount":{"type":"boolean"},"excludeFromNetWorth":{"type":"boolean"},"reclaimableLamports":{"type":"string"},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"}},"required":["label","url"]}}},"required":["mint","account","amount","decimals","programId","isFrozen","isAssociatedTokenAccount","excludeFromNetWorth"]}}},"required":["totalValue","reclaimableCount","holdings"]}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/portfolio/positions/{address}":{"get":{"tags":["Portfolio"],"summary":"Get portfolio positions for a wallet address","operationId":"get_PortfolioPositions","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"Wallet address to get positions for"},"required":true,"description":"Wallet address to get positions for","name":"address","in":"path"}],"responses":{"200":{"description":"Returns portfolio positions grouped by platform","content":{"application/json":{"schema":{"type":"object","properties":{"totalValue":{"type":"number"},"platforms":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"image":{"type":"string"},"url":{"type":"string"}},"required":["id","label"]},"value":{"type":"number"},"positions":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"assets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"symbol":{"type":"string"},"icons":{"type":"array","items":{"type":"string"}},"value":{"type":"number"},"amount":{"type":"number"},"yield":{"type":"number"}},"required":["id","symbol","icons","value"]}}},"required":["category","assets"]}}},"required":["platform","value","positions"]}},"airdrops":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"object","properties":{"label":{"type":"string"},"image":{"type":"string"}},"required":["label"]},"link":{"type":"string"},"value":{"type":"number"}},"required":["platform","value"]}}},"required":["totalValue","platforms","airdrops"]}}}},"400":{"description":"Invalid address","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/asr/side-menu":{"get":{"tags":["ASR"],"summary":"Get ASR side menu entry point","operationId":"get_ASRSideMenu","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"},{"schema":{"type":"string","maxLength":35,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')"},"required":false,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')","name":"locale","in":"query"}],"responses":{"200":{"description":"Returns ASR side menu entry data","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"subtitle":{"type":"string"},"imageUrl":{"type":"string"},"deepLink":{"type":"string"},"amount":{"type":"number","description":"Reward amount in lamports (smallest token unit)"},"mint":{"type":"string","description":"Token mint address"}},"required":["title","subtitle","imageUrl","deepLink"]}}}},"404":{"description":"User not eligible for ASR","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/asr/claim-view":{"get":{"tags":["ASR"],"summary":"Get ASR claim view UI data","operationId":"get_ASRClaimView","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"},{"schema":{"type":"string","maxLength":35,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')"},"required":false,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')","name":"locale","in":"query"}],"responses":{"200":{"description":"Returns ASR claim view UI data","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"subtitle":{"type":"string"},"highlightedTitle":{"type":"string"},"highlightedSubtitle":{"type":"string"},"imageUrl":{"type":"string"},"buttonTitle":{"type":"string"},"isButtonEnabled":{"type":"boolean"},"amount":{"type":"number","description":"Reward amount in lamports (smallest token unit)"},"mint":{"type":"string","description":"Token mint address"}},"required":["title","subtitle","highlightedTitle","highlightedSubtitle","imageUrl","buttonTitle","isButtonEnabled"]}}}},"404":{"description":"User not eligible for ASR","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/asr/craft-claim":{"get":{"tags":["ASR"],"summary":"Craft a claim and stake transaction","operationId":"get_ASRCraftClaim","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"}],"responses":{"200":{"description":"Returns unsigned transaction and request ID","content":{"application/json":{"schema":{"type":"object","properties":{"transaction":{"type":"string"},"requestId":{"type":"string","description":"Deprecated - will be removed in a future version"}},"required":["transaction","requestId"]}}}},"400":{"description":"Bad request - user already claimed or claiming not started","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"404":{"description":"User not eligible for ASR","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/asr/execute":{"post":{"tags":["ASR"],"summary":"Execute a signed claim and stake transaction","operationId":"post_ASRExecute","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signedTransaction":{"type":"string","minLength":1},"lastValidBlockHeight":{"type":"string"},"campaignSlug":{"type":"string","description":"Campaign slug (defaults to asr-q4 for backward compatibility)"}},"required":["signedTransaction"]}}}},"responses":{"200":{"description":"Returns execution result with UI state","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["Success","Failed"]},"signature":{"type":"string"},"code":{"type":"number"},"error":{"type":"string"},"totalTime":{"type":"number"},"buttonTitle":{"type":"string"},"isButtonEnabled":{"type":"boolean"}},"required":["status","totalTime","buttonTitle","isButtonEnabled"]}}}},"400":{"description":"Bad request - invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/side-menu":{"get":{"tags":["Side Menu"],"summary":"Get side menu items for a user","operationId":"get_SideMenu","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"},{"schema":{"type":"string","maxLength":35,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')"},"required":false,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')","name":"locale","in":"query"}],"responses":{"200":{"description":"Returns ordered list of side-menu items (deeplinks)","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Primary display text"},"subtitle":{"type":"string","description":"Secondary display text"},"imageUrl":{"type":"string","description":"Image URL for the menu item"},"deeplink":{"type":"string","description":"Deeplink to navigate to"},"analyticsParams":{"type":"object","additionalProperties":{},"description":"Optional analytics parameters for impression/tap events"}},"required":["title","subtitle","imageUrl","deeplink"]}}},"required":["items"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/referrals/session/challenge":{"get":{"tags":["Referrals"],"summary":"Get session challenge payload to sign","operationId":"get_ReferralSessionChallenge","responses":{"200":{"description":"Returns the payload string to sign with the wallet","content":{"application/json":{"schema":{"type":"object","properties":{"payload":{"type":"string","description":"The authentication message to sign with the wallet"}},"required":["payload"]}}}}}}},"/v1/referrals/session":{"post":{"tags":["Referrals"],"summary":"Create authenticated session for referrals","operationId":"post_ReferralSession","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"address":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"type":{"type":"string","enum":["msg"],"description":"Authentication via message signing"},"signature":{"type":"string","minLength":1,"description":"Base64-encoded signature of the payload, signed by the wallet"},"payload":{"type":"string","minLength":1,"description":"The message that was signed by the wallet"}},"required":["address","type","signature","payload"]},{"type":"object","properties":{"address":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"type":{"type":"string","enum":["tx"],"description":"Authentication via transaction signing (for hardware wallets)"},"tx":{"type":"string","minLength":1,"description":"Base64-encoded fully signed Solana transaction containing the challenge"}},"required":["address","type","tx"]}]}}}},"responses":{"200":{"description":"Returns session tokens","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string","description":"JWT access token for authenticating API requests (1h TTL)"},"expiresIn":{"type":"number","description":"Access token time-to-live in seconds"},"refreshToken":{"type":"string","description":"Refresh token for obtaining new access tokens (1 week TTL)"}},"required":["accessToken","expiresIn","refreshToken"]}}}},"400":{"description":"Bad request - invalid credentials","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/referrals/session/challenge-tx":{"post":{"tags":["Referrals"],"summary":"Get session challenge as an unsigned transaction (for hardware wallets)","operationId":"post_ReferralChallengeTx","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","minLength":32,"maxLength":44,"description":"Wallet public key (base58)"}},"required":["address"]}}}},"responses":{"200":{"description":"Returns a base64-encoded unsigned Solana transaction containing the challenge as a Memo instruction","content":{"application/json":{"schema":{"type":"object","properties":{"tx":{"type":"string","description":"Base64-encoded unsigned Solana transaction with Memo challenge"}},"required":["tx"]}}}},"400":{"description":"Bad request - invalid wallet address","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/referrals/session/refresh":{"post":{"tags":["Referrals"],"summary":"Refresh session","operationId":"post_ReferralRefreshSession","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1,"description":"Refresh token obtained from the session endpoint"}},"required":["refreshToken"]}}}},"responses":{"200":{"description":"Returns new access token","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string","description":"New JWT access token for authenticating API requests (1h TTL)"},"expiresIn":{"type":"number","description":"Access token time-to-live in seconds"}},"required":["accessToken","expiresIn"]}}}},"401":{"description":"Unauthorized - invalid refresh token","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/referrals/view":{"get":{"tags":["Referrals"],"summary":"Get referrals view data","operationId":"get_ReferralView","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"},{"schema":{"type":"string","maxLength":35,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')"},"required":false,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')","name":"locale","in":"query"},{"schema":{"type":["string","null"],"description":"Access token from session endpoint"},"required":false,"description":"Access token from session endpoint","name":"x-access-token","in":"header"}],"responses":{"200":{"description":"Returns referral view data","content":{"application/json":{"schema":{"type":"object","properties":{"refId":{"type":["string","null"],"description":"User's unique referral identifier"},"referralLink":{"type":["string","null"],"description":"Full shareable referral URL (e.g. 'https://jup.ag/?ref=abc123')"},"isReferred":{"type":"boolean","description":"Whether this user was referred by someone else"},"stats":{"type":"object","properties":{"totalReferrals":{"type":"number","description":"Total number of users referred across all tiers"},"tier1":{"type":"number","description":"Number of direct (tier 1) referrals"},"tier2":{"type":"number","description":"Number of tier 2 referrals"},"tier3":{"type":"number","description":"Number of tier 3 referrals"},"referralEarnings":{"type":"string","description":"Total referral earnings formatted as USD with locale (e.g. '$1,234.56')"},"referralEarningsUsd":{"type":"number","description":"Total referral earnings as a raw USD number (e.g. 1234.56)"}},"required":["totalReferrals","tier1","tier2","tier3","referralEarnings","referralEarningsUsd"]}},"required":["refId","referralLink","isReferred","stats"]}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"401":{"description":"Unauthorized - invalid or missing auth token","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/referrals/set-referrer":{"post":{"tags":["Referrals"],"summary":"Enter a referral code","operationId":"post_ReferralSetReferrer","parameters":[{"schema":{"type":["string","null"],"description":"Access token from session endpoint"},"required":false,"description":"Access token from session endpoint","name":"x-access-token","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"refId":{"type":"string","minLength":1,"description":"Referral code from the user who referred you"}},"required":["user","refId"]}}}},"responses":{"200":{"description":"Successfully set referrer","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true],"description":"Whether the referrer was set"}},"required":["success"]}}}},"400":{"description":"Bad request - invalid referral code","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"401":{"description":"Unauthorized - invalid or missing auth token","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/campaigns":{"get":{"tags":["Campaigns"],"summary":"List all campaigns for the Rewards tab","operationId":"get_CampaignList","parameters":[{"schema":{"type":"string","maxLength":35,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')"},"required":false,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')","name":"locale","in":"query"}],"responses":{"200":{"description":"Returns all campaigns sorted by status priority","content":{"application/json":{"schema":{"type":"object","properties":{"campaigns":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string","description":"Campaign identifier"},"tags":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"style":{"type":"string","enum":["success","warning","neutral"]}},"required":["label","style"]},"description":"Styled pills rendered left-to-right (e.g. status, reward pool)"},"title":{"type":"string","description":"Campaign name (bold)"},"description":{"type":"string","description":"Campaign summary (body text)"},"deeplink":{"type":"string","description":"Navigation target on tap"}},"required":["slug","tags","title","description","deeplink"]}}},"required":["campaigns"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/campaigns/{campaignSlug}":{"get":{"tags":["Campaigns"],"summary":"Get campaign detail with server-driven UI sections","operationId":"get_CampaignDetail","parameters":[{"schema":{"type":"string","description":"Campaign slug (e.g. 'asr-q4')"},"required":true,"description":"Campaign slug (e.g. 'asr-q4')","name":"campaignSlug","in":"path"},{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"},{"schema":{"type":"string","maxLength":35,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')"},"required":false,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')","name":"locale","in":"query"},{"schema":{"type":"boolean","default":false,"description":"Whether the wallet is watch-only (disables claiming)"},"required":false,"description":"Whether the wallet is watch-only (disables claiming)","name":"watchOnly","in":"query"}],"responses":{"200":{"description":"Returns campaign detail as ordered UI sections","content":{"application/json":{"schema":{"type":"object","properties":{"sections":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["overview"]},"data":{"type":"object","properties":{"imageUrl":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"tags":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"style":{"type":"string","enum":["success","warning","neutral"]}},"required":["label","style"]}}},"required":["imageUrl","title","description","tags"]}},"required":["type","data"]},{"type":"object","properties":{"type":{"type":"string","enum":["rewardStatus"]},"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"style":{"type":"string","enum":["success","warning","neutral"]}},"required":["label","style"]}},"title":{"type":"string"},"subtitle":{"type":"string"},"amount":{"type":"object","properties":{"value":{"type":"string","description":"Locale-formatted number (e.g. '322.23')"},"label":{"type":"string","description":"Token name (e.g. 'Staked JUP')"},"iconUrl":{"type":"string","description":"Token icon URL"}},"required":["value","label","iconUrl"]}}}},"required":["type","data"]},{"type":"object","properties":{"type":{"type":"string","enum":["infoGroup"]},"data":{"type":"object","properties":{"sections":{"type":"array","items":{"type":"object","properties":{"header":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"iconUrl":{"type":"string"},"content":{"type":"string"}},"required":["content"]}}},"required":["header","items"]}}},"required":["sections"]}},"required":["type","data"]},{"type":"object","properties":{"type":{"type":"string","enum":["collapsibleList"]},"data":{"type":"object","properties":{"title":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"}},"required":["title","content"]}}},"required":["items"]}},"required":["type","data"]}]}},"action":{"type":["object","null"],"properties":{"label":{"type":"string"},"deeplink":{"type":["string","null"]},"leadingIconUrl":{"type":["string","null"]}},"required":["label","deeplink","leadingIconUrl"]}},"required":["sections","action"]}}}},"404":{"description":"Campaign not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/campaigns/{campaignSlug}/claim-view":{"get":{"tags":["Campaigns"],"summary":"Get claim view UI data for a campaign","operationId":"get_CampaignClaimView","parameters":[{"schema":{"type":"string","description":"Campaign slug (e.g. 'asr-q4')"},"required":true,"description":"Campaign slug (e.g. 'asr-q4')","name":"campaignSlug","in":"path"},{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"},{"schema":{"type":"string","maxLength":35,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')"},"required":false,"description":"Locale for number formatting (BCP 47, e.g., 'en-US', 'de-DE')","name":"locale","in":"query"},{"schema":{"type":"boolean","default":false,"description":"Whether the wallet is watch-only (disables claiming)"},"required":false,"description":"Whether the wallet is watch-only (disables claiming)","name":"watchOnly","in":"query"}],"responses":{"200":{"description":"Returns claim view UI data","content":{"application/json":{"schema":{"type":"object","properties":{"campaignSlug":{"type":"string"},"imageUrl":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string"},"highlightedTitle":{"type":["string","null"],"description":"Highlight label (e.g. 'Your rewards:')"},"highlightedSubtitle":{"type":["string","null"],"description":"Formatted reward string (e.g. '1,000 JUP')"},"buttonTitle":{"type":"string","description":"CTA button label"},"isButtonEnabled":{"type":"boolean","description":"Whether the button is interactive"},"amount":{"type":"number","description":"Reward amount in lamports (smallest token unit)"},"mint":{"type":"string","description":"Token mint address"}},"required":["campaignSlug","imageUrl","title","subtitle","highlightedTitle","highlightedSubtitle","buttonTitle","isButtonEnabled"]}}}},"404":{"description":"Campaign not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/campaigns/{campaignSlug}/craft":{"get":{"tags":["Campaigns"],"summary":"Craft an unsigned claim transaction for a campaign","operationId":"get_CampaignCraft","parameters":[{"schema":{"type":"string","description":"Campaign slug (e.g. 'asr-q4')"},"required":true,"description":"Campaign slug (e.g. 'asr-q4')","name":"campaignSlug","in":"path"},{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"User wallet address (Solana)"},"required":true,"description":"User wallet address (Solana)","name":"user","in":"query"}],"responses":{"200":{"description":"Returns unsigned transaction","content":{"application/json":{"schema":{"type":"object","properties":{"transaction":{"type":"string","description":"Base64-encoded unsigned transaction"}},"required":["transaction"]}}}},"400":{"description":"Bad request - user already claimed or claiming not started","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"404":{"description":"Campaign not found or user not eligible","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/campaigns/{campaignSlug}/execute":{"post":{"tags":["Campaigns"],"summary":"Execute a signed campaign transaction","operationId":"post_CampaignExecute","parameters":[{"schema":{"type":"string","description":"Campaign slug (e.g. 'asr-q4')"},"required":true,"description":"Campaign slug (e.g. 'asr-q4')","name":"campaignSlug","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"signedTransaction":{"type":"string","minLength":1},"lastValidBlockHeight":{"type":"string"}},"required":["signedTransaction"]}}}},"responses":{"200":{"description":"Returns execution result with post-action button","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["Success","Failed"]},"signature":{"type":"string","description":"Transaction signature on success"},"code":{"type":"number"},"error":{"type":"string","description":"Error message on failure"},"action":{"type":"object","properties":{"buttonTitle":{"type":"string","description":"Post-action button label"},"isEnabled":{"type":"boolean","description":"Whether the button is interactive"},"deeplink":{"type":["string","null"],"description":"Optional deeplink for the post-action button"}},"required":["buttonTitle","isEnabled","deeplink"]}},"required":["status","action"]}}}},"400":{"description":"Bad request - invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"404":{"description":"Campaign not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/transactions/fetch":{"get":{"tags":["Transactions"],"summary":"Fetch processed transaction history for a wallet","operationId":"get_FetchTransactions","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"Wallet address (Solana)"},"required":true,"description":"Wallet address (Solana)","name":"address","in":"query"},{"schema":{"type":"string","description":"Transaction signature to paginate before"},"required":false,"description":"Transaction signature to paginate before","name":"before","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":100,"description":"Number of transactions to fetch"},"required":false,"description":"Number of transactions to fetch","name":"limit","in":"query"}],"responses":{"200":{"description":"Returns filtered and sorted transaction history for the given wallet address","content":{"application/json":{"schema":{"type":"object","properties":{"transactions":{"type":"array","items":{"type":"object","properties":{"blockTime":{"type":"number"},"signature":{"type":"string"},"service":{"type":"object","properties":{"platformId":{"type":"string"},"name":{"type":"string"}},"required":["platformId","name"]},"platform":{"type":"object","properties":{"name":{"type":"string"},"imageUrl":{"type":"string"}},"required":["name"]},"success":{"type":"boolean"},"balanceChanges":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"change":{"type":"string"}},"required":["address","change"]}}},"required":["blockTime","signature","success","balanceChanges"]}},"tokens":{"type":"object","additionalProperties":{"type":"object","properties":{"address":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"logoUrl":{"type":["string","null"]},"decimals":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"launchpad":{"type":"string"},"stockId":{"type":"string"},"scaledUiMultiplier":{"type":"string"}},"required":["address","name","symbol","logoUrl","decimals","tags","scaledUiMultiplier"]}},"next":{"type":["string","null"],"description":"Cursor to request the next page"}},"required":["transactions","tokens","next"]}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/transaction/{signature}":{"get":{"tags":["Transactions"],"summary":"Get a single processed transaction by signature","operationId":"get_TransactionDetail","parameters":[{"schema":{"type":"string","minLength":1,"description":"Transaction signature (base58)"},"required":true,"description":"Transaction signature (base58)","name":"signature","in":"path"},{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"Wallet address of the owner"},"required":true,"description":"Wallet address of the owner","name":"owner","in":"query"}],"responses":{"200":{"description":"Returns transaction detail","content":{"application/json":{"schema":{"type":"object","properties":{"transaction":{"type":"object","properties":{"blockTime":{"type":"number"},"signature":{"type":"string"},"service":{"type":"object","properties":{"platformId":{"type":"string"},"name":{"type":"string"}},"required":["platformId","name"]},"platform":{"type":"object","properties":{"name":{"type":"string"},"imageUrl":{"type":"string"}},"required":["name"]},"success":{"type":"boolean"},"balanceChanges":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"change":{"type":"string"}},"required":["address","change"]}}},"required":["blockTime","signature","success","balanceChanges"]},"tokens":{"type":"object","additionalProperties":{"type":"object","properties":{"address":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"logoUrl":{"type":["string","null"]},"decimals":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"launchpad":{"type":"string"},"stockId":{"type":"string"},"scaledUiMultiplier":{"type":"string"}},"required":["address","name","symbol","logoUrl","decimals","tags","scaledUiMultiplier"]}}},"required":["transaction","tokens"]}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"404":{"description":"Transaction not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/lend/markets":{"get":{"tags":["Lend"],"summary":"Get lending markets with APY rates","operationId":"get_LendMarkets","responses":{"200":{"description":"List of lending markets","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"mint":{"type":"string","description":"Underlying asset mint address"},"symbol":{"type":"string","description":"Underlying asset symbol (e.g. USDC)"},"receiptMint":{"type":"string","description":"JupLend receipt token mint (e.g. jlUSDC address)"},"supplyApy":{"type":"number","description":"Supply APY as decimal fraction (e.g. 0.0484 = 4.84%)"},"rewardsApy":{"type":"number","description":"Rewards APY as decimal fraction (e.g. 0.0484 = 4.84%)"},"totalApy":{"type":"number","description":"Total APY as decimal fraction (e.g. 0.0484 = 4.84%)"},"logoUrl":{"type":"string","description":"Token logo URL"},"decimals":{"type":"number","description":"Underlying asset decimals"}},"required":["mint","symbol","receiptMint","supplyApy","rewardsApy","totalApy","decimals"]}}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/reclaim/craft":{"post":{"tags":["Reclaim"],"summary":"Craft unsigned reclaim transactions for empty token accounts","operationId":"post_ReclaimCraft","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"owner":{"type":"string","minLength":32,"maxLength":44,"description":"Owner wallet address (Solana)"},"mints":{"type":"array","items":{"type":"string","minLength":32,"maxLength":44},"minItems":1,"description":"Token mint addresses to reclaim"}},"required":["owner","mints"]}}}},"responses":{"200":{"description":"Returns unsigned reclaim transactions","content":{"application/json":{"schema":{"type":"object","properties":{"transactions":{"type":"array","items":{"type":"object","properties":{"requestId":{"type":"string"},"transaction":{"type":"string"},"lastValidBlockHeight":{"type":"string"}},"required":["requestId","transaction"]}},"totalLamportsReclaimed":{"type":"string"},"netLamportsReclaimed":{"type":"string"},"netReclaimedUsdAmount":{"type":"number"},"serviceFeeLamports":{"type":"string"},"serviceFeeUsdAmount":{"type":"number"},"gasCostLamports":{"type":"string"},"gasCostUsdAmount":{"type":"number"},"skippedMints":{"type":"array","items":{"type":"object","properties":{"mint":{"type":"string"},"skipReason":{"type":"string"}},"required":["mint","skipReason"]}},"expireAt":{"type":"string"}},"required":["transactions","totalLamportsReclaimed","netLamportsReclaimed","netReclaimedUsdAmount","serviceFeeLamports","serviceFeeUsdAmount","gasCostLamports","gasCostUsdAmount","expireAt"]}}}},"400":{"description":"Bad request - invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/reclaim/execute":{"post":{"tags":["Reclaim"],"summary":"Execute signed reclaim transactions","operationId":"post_ReclaimExecute","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"transactions":{"type":"array","items":{"type":"object","properties":{"signedTransaction":{"type":"string","minLength":1},"requestId":{"type":"string","minLength":1},"lastValidBlockHeight":{"type":"string"}},"required":["signedTransaction","requestId"]},"minItems":1,"maxItems":500}},"required":["transactions"]}}}},"responses":{"200":{"description":"Returns execution results for each transaction","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"requestId":{"type":"string"},"status":{"type":"string"},"signature":{"type":"string"},"error":{"type":"string"}},"required":["requestId","status"]}}},"required":["results"]}}}},"400":{"description":"Bad request - invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/transfers/recents/{address}":{"get":{"tags":["Transfers"],"summary":"Get recent send addresses for a wallet","operationId":"get_RecentSendAddresses","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44,"description":"Wallet address (Solana)"},"required":true,"description":"Wallet address (Solana)","name":"address","in":"path"}],"responses":{"200":{"description":"Returns recent addresses that have sent to or received from the given wallet","content":{"application/json":{"schema":{"type":"object","properties":{"addresses":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","description":"Destination wallet address"},"blockTime":{"type":"string","description":"ISO 8601 timestamp of the most recent send"}},"required":["address","blockTime"]}}},"required":["addresses"]}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/universal-deposit/chains":{"get":{"tags":["Universal Deposit"],"summary":"Get supported chains with deposit addresses for Universal Deposit","operationId":"get_GetUniversalDepositChains","parameters":[{"schema":{"type":"string","minLength":32,"maxLength":44},"required":true,"name":"destinationAddress","in":"query"}],"responses":{"200":{"description":"List of supported chains with deposit addresses","content":{"application/json":{"schema":{"type":"object","properties":{"chains":{"type":"array","items":{"type":"object","properties":{"chainId":{"type":"number"},"name":{"type":"string"},"iconUrl":{"type":"string"},"address":{"type":"string"},"warningMessage":{"type":"string"},"status":{"type":"number","description":"Effective status code (worst of destination and origin chain): 0=healthy, 1=degraded, 2=down, 4=unknown"},"statusInfo":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable status message"},"iconUrl":{"type":"string","description":"Icon URL for the status banner"},"style":{"type":"string","enum":["warning","error"],"description":"Banner style: warning (amber) for degraded, error (red) for down/unknown"}},"required":["message","iconUrl","style"],"description":"Status banner info for non-healthy chains"}},"required":["chainId","name","iconUrl","address","status"]}}},"required":["chains"]}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}},"500":{"description":"Failed to fetch deposit addresses from Gum API","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/active-wallets":{"get":{"tags":["Wallets"],"summary":"Get active wallets with USD balances","operationId":"get_ActiveWallets","parameters":[{"schema":{"type":"string","description":"Comma-separated Solana wallet addresses (max 20)"},"required":true,"description":"Comma-separated Solana wallet addresses (max 20)","name":"addresses","in":"query"}],"responses":{"200":{"description":"Returns a map of active wallet addresses to their info. Only wallets with balance > 0 or any transaction history are included.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object","properties":{"balance":{"type":"number","description":"Total USD balance"},"domain":{"type":"string","description":"Reverse-resolved domain name"}}}}}}},"400":{"description":"Invalid request parameters","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}},"/v1/events":{"post":{"tags":["Events"],"summary":"Ingest batched mobile analytics and observability events","operationId":"post_PostEvents","parameters":[{"schema":{"type":["string","null"],"description":"Device platform (e.g. 'ios', 'android')"},"required":false,"description":"Device platform (e.g. 'ios', 'android')","name":"X-Platform","in":"header"},{"schema":{"type":["string","null"],"description":"App version (e.g. '2.34.0')"},"required":false,"description":"App version (e.g. '2.34.0')","name":"X-App-Version","in":"header"},{"schema":{"type":["string","null"],"description":"Build number: iOS CFBundleVersion or Android versionCode (e.g. '202401')"},"required":false,"description":"Build number: iOS CFBundleVersion or Android versionCode (e.g. '202401')","name":"X-App-Build","in":"header"},{"schema":{"type":["string","null"],"description":"Stable device identifier"},"required":false,"description":"Stable device identifier","name":"X-Device-Id","in":"header"},{"schema":{"type":["string","null"],"description":"ISO 3166-1 alpha-2 country code from device locale (e.g. 'US', 'DE')"},"required":false,"description":"ISO 3166-1 alpha-2 country code from device locale (e.g. 'US', 'DE')","name":"X-Country","in":"header"},{"schema":{"type":["string","null"],"description":"Device manufacturer (e.g. 'Apple', 'Samsung')"},"required":false,"description":"Device manufacturer (e.g. 'Apple', 'Samsung')","name":"X-Device-Brand","in":"header"},{"schema":{"type":["string","null"],"description":"Device model identifier (e.g. 'iPhone15,2')"},"required":false,"description":"Device model identifier (e.g. 'iPhone15,2')","name":"X-Device-Model","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","enum":["analytics","observability"],"description":"Routes the event to its destination topic. 'analytics' -> jupiter.analytics.mobile.event-logs.completed.v1. 'observability' -> jupiter.observability.mobile.event-logs.completed.v1."},"trace_id":{"type":"string","minLength":1,"maxLength":128,"description":"Optional correlation id. If omitted, the server generates a UUID per event. Clients SHOULD supply a shared value across events that belong to the same flow (e.g. swap started / signed / completed) so ClickHouse can join them."},"feature":{"type":"string","minLength":1,"maxLength":64,"description":"Product area (e.g., 'swap', 'lend', 'portfolio')"},"event":{"type":"string","minLength":1,"maxLength":128,"description":"Event name within the feature (e.g., 'started', 'completed')"},"action":{"type":"string","maxLength":128},"user":{"type":"string","maxLength":64,"description":"Wallet address or anonymized user identifier"},"user_type":{"type":"string","maxLength":64,"description":"Type of the user field value (e.g. 'wallet', 'anonymous')"},"metadata":{"type":"string","description":"JSON-encoded event-specific parameters (max 16KB UTF-8)"},"timestamp":{"type":"integer","exclusiveMinimum":0,"description":"Unix timestamp in ms"}},"required":["channel","feature","event","timestamp"]},"minItems":1,"maxItems":100}},"required":["events"]}}}},"responses":{"202":{"description":"Events accepted for asynchronous delivery to RedPanda","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"integer","minimum":0}},"required":["accepted"]}}}},"400":{"description":"Bad request - invalid batch payload","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"error":{"type":"string"}},"required":["code","error"]}}}}}}}},"webhooks":{}}