{"name":"SUPRX Mobile Wallet API","version":1,"guardrails":["Keys stay on device.","Scan only public addresses or descriptors.","Pending history requires includePending=true.","Labels stay in local app storage.","Broadcast only signed raw transactions."],"notes":["Keys stay on device.","Scan only public addresses or descriptors.","Pending history requires includePending=true.","Labels stay in local app storage.","Broadcast only signed raw transactions."],"routes":{"health":{"method":"GET","path":"/api/mobile/health","purpose":"Current chain tip, peer count, and fee surface."},"config":{"method":"GET","path":"/api/mobile/config","purpose":"Network rules the app needs to derive and validate SUPRX-native wallets."},"docs":{"method":"GET","path":"/api/mobile/docs","purpose":"Self-describing API reference for mobile integration."},"fees":{"method":"GET","path":"/api/mobile/fees","purpose":"Relay and estimated fee data for send flow."},"validateAddress":{"method":"POST","path":"/api/mobile/validate-address","purpose":"Validate a native SUPRX destination address before send.","body":{"address":"sx1..."}},"scan":{"method":"POST","path":"/api/mobile/scan","purpose":"Scan a batch of derived addresses for live UTXOs and totals.","body":{"addresses":["sx1...","sx1..."]}},"scanDescriptors":{"method":"POST","path":"/api/mobile/scan-descriptors","purpose":"Derive public descriptors into addresses, then scan live UTXOs for those addresses.","body":{"descriptorSets":[{"receiveDescriptor":"wpkh(xpub.../0/*)","changeDescriptor":"wpkh(xpub.../1/*)","rangeStart":0,"rangeEnd":99}]}},"history":{"method":"POST","path":"/api/mobile/history","purpose":"Return pending and confirmed native SUPRX transaction history for a batch of addresses.","body":{"addresses":["sx1...","sx1..."],"startHeight":0,"limit":100,"includePending":true,"status":"confirmed,pending","direction":"receive,send"},"filters":{"status":["confirmed","pending"],"direction":["receive","send","self","unknown"]},"transactionFields":["txid","status","direction","confirmations","height","timestamp","delta","received","sent"]},"txDetail":{"method":"GET","path":"/api/mobile/tx/:txid","purpose":"Return a native SUPRX transaction detail object."},"blocks":{"method":"GET","path":"/api/mobile/blocks?limit=100","purpose":"Return the latest native SUPRX blocks for mobile live-block views."},"blockDetail":{"method":"GET","path":"/api/mobile/block/:heightOrHash","purpose":"Return one native SUPRX block with transaction summaries."},"restoreCreate":{"method":"POST","path":"/api/mobile/restore-jobs","purpose":"Start a restore scan job for public descriptors or a derived address set."},"restoreStatus":{"method":"GET","path":"/api/mobile/restore-jobs/:id","purpose":"Check restore scan status and result summary."},"broadcast":{"method":"POST","path":"/api/mobile/broadcast","purpose":"Broadcast a fully signed native SUPRX raw transaction.","body":{"txHex":"hex-encoded raw transaction"}},"wrapTemplate":{"method":"GET","path":"/api/mobile/wrap-template?amountSats=1000000&recipient=0x...","purpose":"Return the treasury payment and OP_RETURN commitment a self-custody wallet must include before broadcasting an SPV wrap deposit."},"wrapClaim":{"method":"POST","path":"/api/wrap-claims","purpose":"Track a broadcast native wrap deposit after the wallet has a Transaction ID.","body":{"amountSats":"native deposit amount in satoshis","nativeTxId":"SUPRX Transaction ID","recipient":"Base wallet receiving wSUPRX","suprxSourceAddress":"active wallet sx1 source address","vout":"optional output index when one Transaction ID has more than one treasury output"},"behavior":["A plain treasury send cannot mint through SPV; the transaction must include the template OP_RETURN commitment.","Submitting the same Transaction ID, recipient, amount, and output again returns the existing claim instead of creating a duplicate.","One Transaction ID can track multiple wrap claims only when each claim points to a different treasury output vout."]}}}