पूल कार्ड और उसका JSON
इस साइट की दो चीज़ें दूसरी साइटों के लिए बनी हैं: एक पूल का सुझाया गया दायरा दिखाने वाला कार्ड, जिसे कोई भी पृष्ठ एक फ़्रेम में रख सकता है, और वही आँकड़े JSON में, जिन्हें किसी भी साइट का कोड पढ़ सकता है। दोनों में से किसी के लिए कुंजी या खाते की ज़रूरत नहीं। दोनों का वर्णन यहाँ वैसा ही है जैसा कोड उन्हें देता है, और टेस्ट इस पृष्ठ को उसी कोड से बाँधे रखते हैं: इसमें लिखा हर पैरामीटर वही है जिससे पता पढ़ा जाता है, और हर फ़ील्ड वही है जिससे जवाब भेजे जाने से पहले मिलाया जाता है।
कार्ड
/embed/pool एक छोटा पृष्ठ है जो साइट के फ़्रेमवर्क से नहीं, हाथ से लिखा गया है। इस पर जोड़ी अपने प्रोटोकॉल, शुल्क और नेटवर्क के साथ दिखती है; सुझाया गया दायरा, उस अवधि और चौड़ाई के साथ जिसके लिए वह बना; मौजूदा कीमत; एक पंक्ति कि यह वित्तीय सलाह नहीं है; और यहाँ पूल के पृष्ठ पर लौटने वाला लिंक, जो नए टैब में खुलता है। दायरा हमेशा साइट की डिफ़ॉल्ट सेटिंग से बनता है, 30 दिन और 1σ, चाहे किसी की अपनी सेटिंग कुछ भी हो। जब तक मौजूदा कीमत दायरे से बाहर है, एक नोट जुड़ता है, और एक और नोट उस v4 पूल के लिए जिसका hook स्वैप की लागत बदल सकता है।
इसमें न कोई स्क्रिप्ट है, न कोई फ़ॉर्म, और यह कुछ भी लोड नहीं करता: इसकी अपनी Content-Security-Policy इसकी इनलाइन स्टाइल के सिवा किसी चीज़ की अनुमति नहीं देती। इसके रंग साइट के हैं, हल्के या गहरे, जैसा पाठक का सिस्टम सेट है। यह अपने आसपास का पृष्ठ नहीं देख सकता, और इसे चुनने का कोई पैरामीटर नहीं है।
इसे 360 पिक्सेल चौड़ा और 220 पिक्सेल ऊँचा फ़्रेम दें, या ऐसे पूल के लिए 260 पिक्सेल ऊँचा जिसका hook स्वैप की लागत बदल सकता है, क्योंकि उसके कार्ड में एक पंक्ति ज़्यादा होती है। हर पूल का पृष्ठ "इस पूल को अपनी साइट पर लगाएँ" के नीचे ठीक यही देता है, उस पूल के लिए सही ऊँचाई के साथ, और दिया गया फ़्रेम उस कॉलम से कभी चौड़ा नहीं होता जिसमें उसे चिपकाया जाए।
यह इस साइट का अकेला पृष्ठ है जिसे कोई दूसरी साइट फ़्रेम में रख सकती है। हर दूसरा पता, यह पृष्ठ भी, X-Frame-Options: DENY और frame-ancestors 'none' के साथ भेजा जाता है; कार्ड पहले वाले के बिना और frame-ancestors * के साथ भेजा जाता है।
<iframe src="https://liquiditywise.com/embed/pool?address=0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8" title="USDC / WETH on LiquidityWise" width="360" height="220" style="border:0;max-width:100%" loading="lazy"></iframe>Content-Type: text/html; charset=utf-8
Cache-Control: public, max-age=300, s-maxage=300
Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors *पैरामीटर
कार्ड और JSON एक जैसे पैरामीटर लेते हैं, और पूल का नाम वैसे ही लेते हैं जैसे साइट के अपने पृष्ठ: v3 पूल उसके address से, जैसे /pool पर, और v4 पूल उसके id से, जैसे /v4 पर। दोनों में से ठीक एक चाहिए, और कौन-सा आया, यही बताता है कि प्रोटोकॉल कौन-सा है। दो बार दिया गया पूल या नेटवर्क अस्वीकार होता है, उसके किसी एक मान को चुना नहीं जाता, और यहाँ न लिखा कोई भी पैरामीटर अनदेखा किया जाता है।
भाषा केवल पते से आती है, पाठक के ब्राउज़र या किसी कुकी से कभी नहीं: कार्ड लगाने वाली साइट उसे चुनती है, और एक ही पता उसे लोड करने वाले हर व्यक्ति के लिए एक ही जवाब है, इसी से कैश उसे रख पाता है। कार्ड साइट की सभी 10 भाषाओं में लिखा है, और अरबी में दाएँ से बाएँ पढ़ा जाता है।
address- स्वीकार करता है v3 पूल के कॉन्ट्रैक्ट का पता:
0xऔर 40 हेक्साडेसिमल अंक, बड़े या छोटे अक्षरों में। - वरना इसके अलावा कुछ भी किसी पूल का नाम नहीं लेता, और न ही ऐसे नेटवर्क पर v3 पूल जहाँ v3 नहीं पढ़ा जाता (Unichain):
400, और कुछ नहीं पढ़ा जाता। id- स्वीकार करता है v4 पूल का id, उसकी कुंजी का हैश:
0xऔर 64 हेक्साडेसिमल अंक, बड़े या छोटे अक्षरों में। - वरना इसके अलावा कुछ भी किसी पूल का नाम नहीं लेता:
400, और कुछ नहीं पढ़ा जाता।addressके साथ दिया गयाidभी नहीं। chain- स्वीकार करता है नीचे की तालिका से किसी नेटवर्क का छोटा नाम। न दिया जाए, तो नेटवर्क Ethereum है।
- वरना ऐसा नाम जिसे साइट नहीं पढ़ती, अस्वीकार होता है, कभी Ethereum नहीं माना जाता:
400। lang- स्वीकार करता है नीचे की सूची से एक भाषा कोड, कार्ड के शब्दों और JSON के
disclaimerके लिए; आँकड़े हर भाषा में एक ही हैं। न दिया जाए, तो अंग्रेज़ी। - वरना कोई और मान, या दो बार दिया गया
lang, अंग्रेज़ी देता है। यह कभी अस्वीकार नहीं होता।
नेटवर्क, उस छोटे नाम से जो chain लेता है:
chain | नेटवर्क | v3 पूल | v4 पूल |
|---|---|---|---|
ethereum | Ethereum | पढ़े जाते हैं | पढ़े जाते हैं |
base | Base | पढ़े जाते हैं | पढ़े जाते हैं |
arbitrum | Arbitrum One | पढ़े जाते हैं | पढ़े जाते हैं |
unichain | Unichain | नहीं पढ़े जाते | पढ़े जाते हैं |
optimism | OP Mainnet | पढ़े जाते हैं | पढ़े जाते हैं |
polygon | Polygon | पढ़े जाते हैं | पढ़े जाते हैं |
भाषाएँ, उस कोड से जो lang लेता है:
enEnglishtrTürkçedeDeutschesEspañolarالعربيةhiहिन्दीzh中文ruРусскийptPortuguêszh-Hant繁體中文
JSON
GET /api/embed/pool, उन्हीं पैरामीटरों के साथ, कार्ड के आँकड़े JSON में देता है, उस साइट के लिए जो उन्हें ख़ुद बनाना पसंद करे: वही रीडिंग, उतनी ही देर रखी हुई। हर आँकड़ा एक JSON संख्या है, और हर कीमत उसी दिशा में लिखी है जिसमें पूल का पृष्ठ उसे लिखता है: एक price.base कितने price.quote के बराबर है।
भेजे जाने से पहले जवाब को उसके स्कीमा से मिलाया जाता है, और जो जवाब उस पर खरा नहीं उतरता, वह भेजा नहीं जाता: उसके बदले पूल को न पढ़ा जा सकने वाला बताया जाता है। इसलिए 200 स्टेटस वाले जवाब में हमेशा ठीक नीचे वाले फ़ील्ड होते हैं, न ज़्यादा न कम।
किसी भी साइट की स्क्रिप्ट इसे पढ़ सकती है। हर जवाब, त्रुटियाँ और अस्वीकृतियाँ भी, Access-Control-Allow-Origin: * के साथ भेजा जाता है। यह कोई कुकी नहीं रखता और किसी क्रेडेंशियल की ज़रूरत नहीं। सादे GET को preflight की ज़रूरत नहीं होती, और किसी preflight का जवाब नहीं दिया जाता, इसलिए अनुरोध अपने हेडर जोड़े बिना भेजें।
Content-Type: application/json; charset=utf-8
Cache-Control: public, max-age=300, s-maxage=300
Access-Control-Allow-Origin: *200 जवाब का हर फ़ील्ड, उसके JSON प्रकार के साथ:
protocol"v3" | "v4"addressसे नामित पूल के लिएv3,idसे नामित पूल के लिएv4।chain.idinteger > 0- नेटवर्क का chain id।
chain.slugstring- नेटवर्क का छोटा नाम, जैसा
chainउसे लेता है। chain.namestring- नेटवर्क का नाम।
poolstring- पूल का पता (v3) या id (v4), छोटे अक्षरों में।
pair.token0string- पूल के पहले टोकन का प्रतीक, जैसा उसका कॉन्ट्रैक्ट बताता है: यह ऐसे कॉन्ट्रैक्ट का पाठ है जिसे कोई भी तैनात कर सकता है, इसलिए पृष्ठ में रखने से पहले उसे escape करें।
pair.token1string- दूसरे टोकन का प्रतीक, उसी तरह।
lpFeePpminteger ≥ 0 | null- स्वैप पर पूल तरलता देने वालों को जो शुल्क देता है, दस लाखवें हिस्सों में:
3000यानी 0.3%। जब v4 पूल का hook शुल्क हर स्वैप पर अलग तय करता है, तबnull। price.basestring- वह टोकन जिसकी एक इकाई के लिए हर कीमत दी गई है।
price.quotestring- वह टोकन जिसमें हर कीमत गिनी गई है।
price.currentnumber > 0- पढ़े जाने के समय पूल की कीमत।
range.lowernumber > 0- सुझाए गए दायरे का निचला किनारा, कीमत के रूप में।
range.uppernumber > 0- उसका ऊपरी किनारा।
range.currentInRangeboolean- मौजूदा कीमत दायरे के भीतर है या नहीं। न हो, तो कार्ड एक नोट जोड़ता है।
range.lowerTruncatedbooleantrueजब पूल की tick ग्रिड बैंड के निचले किनारे तक नहीं पहुँच पाती, इसलिए दायरा उससे पहले रुक जाता है।range.upperTruncatedboolean- वही, ऊपरी किनारे के लिए।
parameters.horizonDaysinteger > 0- वह अवधि जिसके लिए दायरा बना, दिनों में: हमेशा डिफ़ॉल्ट, 30।
parameters.standardDeviationMultipliernumber > 0- वह चौड़ाई जिसके लिए वह बना, मानक विचलनों में: हमेशा डिफ़ॉल्ट, 1σ।
hookMayAlterSwapsboolean- उस v4 पूल के लिए
trueजिसका hook स्वैप की लागत बदल सकता है, hook के पते से पढ़ा गया; v3 के लिए, बिना hook वाले v4 पूल के लिए, और ऐसे hook के लिए जिसकी अनुमतियाँ स्वैप को नहीं छूतीं,false। जहाँtrueहै, कार्ड पर एक नोट होता है। analysedAtstring (ISO 8601)- कीमत कब पढ़ी गई, UTC में, मिलीसेकंड तक — यह नहीं कि यह जवाब कब भेजा गया, जो कुछ मिनट बाद हो सकता है।
poolUrlstring- इस साइट पर पूल का पृष्ठ, उसी अवधि और चौड़ाई के साथ।
disclaimerstring- आँकड़े क्या हैं और क्या नहीं, उस भाषा में जो
langबताता है।
{
"protocol": "v3",
"chain": {
"id": 1,
"slug": "ethereum",
"name": "Ethereum"
},
"pool": "0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
"pair": {
"token0": "USDC",
"token1": "WETH"
},
"lpFeePpm": 3000,
"price": {
"base": "WETH",
"quote": "USDC",
"current": 3000
},
"range": {
"lower": 2824.2704157479307,
"upper": 3184.336896959513,
"currentInRange": true,
"lowerTruncated": false,
"upperTruncated": false
},
"parameters": {
"horizonDays": 30,
"standardDeviationMultiplier": 1
},
"hookMayAlterSwaps": false,
"analysedAt": "2026-08-21T09:15:00.000Z",
"poolUrl": "https://liquiditywise.com/pool?address=0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8&days=30&sigma=1",
"disclaimer": "For information only, not financial advice. The range is worked out from how far this pool's price moved over the last 30 days: it is not a forecast and not a recommendation."
}स्टेटस कोड और त्रुटियाँ
कार्ड और JSON एक जैसे स्टेटस कोड से जवाब देते हैं। दोनों में से कोई कभी साइट के अपने त्रुटि पृष्ठ से या भीतर क्या बिगड़ा, उससे जवाब नहीं देता: कार्ड एक वाक्य और लौटने का अपना लिंक दिखाता है, और JSON एक error के साथ जवाब देता है जिसे स्क्रिप्ट जाँच सके, और disclaimer के साथ — सिवाय अस्वीकृति के, जिसमें उसकी जगह इंतज़ार का समय होता है।
JSON का जवाब, और उसे कितनी देर रखा जा सकता है:
200
आँकड़े: उनके साथ कार्ड, या ऊपर वाला JSON।
Cache-Control: public, max-age=300, s-maxage=300400 not-a-pool
पता ऐसे किसी पूल का नाम नहीं लेता जिसे साइट पढ़ती है: न address न id, या दोनों, या कोई एक बिगड़ा हुआ या दो बार दिया गया, ऐसा नेटवर्क जिसे साइट नहीं पढ़ती, या ऐसी जगह v3 पूल जहाँ केवल v4 पढ़ा जाता है (Unichain)। कुछ नहीं पढ़ा गया, और दोबारा पूछने से जवाब नहीं बदलेगा।
Cache-Control: public, max-age=3600, s-maxage=3600
{
"error": "not-a-pool",
"disclaimer": "For information only, not financial advice. The range is worked out from how far this pool's price moved over the last 30 days: it is not a forecast and not a recommendation."
}503 unreadable
सही ढंग से नामित पूल जो अभी पढ़ा नहीं जा सका: कोई स्रोत समय पर जवाब नहीं दे सका, या उस नेटवर्क पर ऐसा कोई पूल नहीं है। poolUrl फिर भी उसके पृष्ठ तक ले जाता है। एक मिनट बाद दोबारा पूछने पर वह मिल सकता है।
Cache-Control: public, max-age=60, s-maxage=60
{
"error": "unreadable",
"poolUrl": "https://liquiditywise.com/pool?address=0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8&days=30&sigma=1",
"disclaimer": "For information only, not financial advice. The range is worked out from how far this pool's price moved over the last 30 days: it is not a forecast and not a recommendation."
}429 rate-limited
एक ही क्लाइंट से बहुत अधिक अनुरोध: नीचे अनुरोध सीमा देखें। Retry-After और retryAfterSeconds दोनों बताते हैं कि कितने सेकंड रुकना है। कार्ड अपनी भाषा में यही कहने वाले एक छोटे पृष्ठ से जवाब देता है।
Cache-Control: no-store
Retry-After: 42
{
"error": "rate-limited",
"retryAfterSeconds": 42
}कैशिंग और अनुरोध सीमा
हर जवाब बताता है कि उसे कितनी देर रखा जा सकता है, ब्राउज़र में भी और साझा कैश में भी: आँकड़े 300 सेकंड; न पढ़ा जा सका पूल 60 सेकंड, ताकि लौट आया पूल ज़्यादा देर तक न पढ़ा जा सकने वाला न दिखे; किसी पूल का नाम न लेने वाला पता 3,600 सेकंड, क्योंकि बाद का कोई पल इसे नहीं बदलेगा। अस्वीकृति कभी नहीं रखी जाती। हर जवाब उसी पते से पूछने वाले हर व्यक्ति के लिए एक जैसा है, और यही उसे रखना सुरक्षित बनाता है।
इसके पीछे सर्वर हर पूल के आँकड़े उन्हें पढ़ने के पल से 300 सेकंड तक रखता है, कार्ड और JSON दोनों के लिए, हर भाषा में: किसी एक पूल का हर कार्ड, जिस भी पृष्ठ पर लगा हो, अवधि ख़त्म होने तक एक ही रीडिंग है। जो पूल पढ़ा न जा सका, वह रखा नहीं जाता, और अगले अनुरोध पर फिर पूछा जाता है। इसलिए जवाब में कीमत जवाब से पुरानी हो सकती है: analysedAt बताता है कि वह कब पढ़ी गई।
जो अनुरोध सही ढंग से लिखे पूल का नाम लेता है, वह उस पूल को पढ़ता है, इसलिए वह उसी कोटे में गिना जाता है जिसमें साइट के अपने पूल पृष्ठ: हर क्लाइंट के लिए 60 सेकंड की खिड़की में 10 अनुरोध, और यह खिड़की क्लाइंट के पहले अनुरोध से शुरू होती है; क्लाइंट वह IP पता है जिससे अनुरोध साइट तक पहुँचता है। सीमा पार होने पर जवाब Retry-After के साथ 429 है। साइट तक पहुँचने वाला ऐसा हर अनुरोध गिना जाता है, सर्वर के रखे आँकड़ों से जवाब पाने वाला भी; किसी पूल का नाम न लेने वाला अनुरोध नहीं गिना जाता।
ब्राउज़र से, कार्ड या fetch उस पाठक के खाते में गिना जाता है जो उसे लोड करता है, उस साइट के नहीं जिस पर वह लगा है — इसलिए 10 से ज़्यादा कार्ड लगाने वाले पृष्ठ पर, उससे ऊपर के कार्ड हर पाठक के लिए अस्वीकार होंगे। सर्वर से, आपके सारे अनुरोध उस सर्वर का एक ही कोटा बाँटते हैं: हर जवाब को उतने 300 सेकंड रखें जितने वह अनुमति देता है; इसकी कीमत कम है, क्योंकि उस समय के ज़्यादातर हिस्से में सर्वर वैसे भी वही रीडिंग देता जो आपके पास है। सीमा पूल पढ़ने की लागत कम रखने के लिए है, और यहाँ कुछ भी वादा नहीं करता कि वह ऐसी ही रहेगी।
उदाहरण
curl -s "https://liquiditywise.com/api/embed/pool?address=0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8"const response = await fetch(
"https://liquiditywise.com/api/embed/pool?address=0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8",
);
const body = await response.json();
if (response.ok) {
// The range, in body.price.quote per one body.price.base
console.log(body.range.lower, body.range.upper, body.price.quote, body.price.base);
console.log(body.disclaimer);
} else if (response.status === 429) {
console.log(`Asked too often: wait ${body.retryAfterSeconds} seconds`);
} else {
console.log(body.error); // "not-a-pool" or "unreadable"
}<iframe src="https://liquiditywise.com/embed/pool?address=0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8" title="USDC / WETH on LiquidityWise" width="360" height="220" style="border:0;max-width:100%" loading="lazy"></iframe>एक क्लिक पूरा ब्लॉक चुन लेता है, कॉपी करने के लिए तैयार।
शर्तें, सादे शब्दों में
आँकड़े माप हैं, सलाह नहीं। दायरा इस बात से निकाला जाता है कि पिछले 30 दिनों में पूल की कीमत कितनी हिली: यह कोई पूर्वानुमान नहीं है और कोई सिफ़ारिश भी नहीं, और हर जवाब यह ख़ुद कहता है, कार्ड अपने सामने और JSON disclaimer में। हर आँकड़ा कैसे बनता है और क्या छोड़ देता है, यह "यह कैसे काम करता है" पृष्ठ पर है।
कार्ड पर लौटने का उसका अपना लिंक है, "LiquidityWise द्वारा विश्लेषित"। JSON में श्रेय देने का कोई फ़ील्ड नहीं है, और कोड में कुछ भी इसे नहीं माँगता; उसमें जो है वह है poolUrl, यहाँ पूल का पृष्ठ, और disclaimer। आँकड़ों के पास दिखाए जाएँ, तो ये दोनों पाठक को बताते हैं कि आँकड़े कहाँ से आए और क्या हैं।
न कोई वर्ज़न नंबर है, न कुंजी, और न यह वादा कि जवाब का आकार ऐसा ही रहेगा या साइट किसी भी पल उपलब्ध होगी। जो पक्का है, वह इससे सीमित है: भेजने से पहले जवाब को उसके स्कीमा से मिलाया जाता है, और टेस्ट इस पृष्ठ को उस स्कीमा और पता पढ़ने वाले कोड से बाँधे रखते हैं, इसलिए यह वही बताता है जो अभी दिया जाता है। दोनों में कोई भी बदलाव कोड के सार्वजनिक इतिहास में दिखता है।
कोड ओपन सोर्स है, MIT लाइसेंस के तहत।