OFFCODEDOCSप्लेटफ़ॉर्म खोलें

सार्वजनिक API

चार केवल-पढ़ने वाले रूट, बिना कुंजी और बिना कुकी, उन फ़ील्ड नामों के साथ जिनकी एग्रीगेटर (CoinGecko, CoinMarketCap) और बाज़ार लाइब्रेरियाँ (CCXT) अपेक्षा करती हैं। ये रोबोट द्वारा पढ़े जाने के लिए हैं: जो डैशबोर्ड बनाता है, इंडेक्स भरता है या भाव मिलाता है, वह यहाँ से पढ़ता है। इस API में ऑर्डर देने का कोई रूट नहीं है — इसके किसी भी रूट से धन का लेन-देन नहीं होता और इसे इस्तेमाल करने के लिए खाते की ज़रूरत नहीं है।

आधार और परंपराएँ

सब कुछ https://offcode.pro/api/public/ पर टिका है, केवल GET स्वीकारता है और application/json लौटाता है। ticker_id BASE_TARGET (BTC_USDT) रूप में है: अंडरस्कोर से पहले बेस, बाद में कोट, बड़े अक्षर और अंक, हर तरफ़ 2 से 15 अक्षर। जिस जोड़ी का प्रतीक इस रूप में नहीं समाता, वह प्रकाशित नहीं होती।

हर संख्या दशमलव स्ट्रिंग के रूप में जाती है, कभी फ़्लोटिंग-पॉइंट संख्या के रूप में नहीं — आठ दशमलव वाला कॉइन float से गुज़रते हुए दशमलव खो देता है। क्षण Unix epoch से मिलीसेकंड हैं।

रूटक्या लौटाता हैपैरामीटर
GET /pairsइस फ़ीड में उपलब्ध सभी ट्रेडिंग जोड़ियाँ, हर जोड़ी के भाव के स्रोत की जानकारी के साथ
GET /tickersस्पॉट जोड़ियों के लिए भाव, 24 घंटे का वॉल्यूम, उच्च, निम्न और दोनों पक्ष
GET /orderbookएक जोड़ी की ऑर्डर बुकticker_id · depth
GET /tradesएक जोड़ी के हालिया सौदे, नवीनतम पहलेticker_id · type · limit
GET /historical_trades/trades जैसा ही — दो नाम, एक कार्यान्वयनवही

जोड़ियाँ — /pairs

इस फ़ीड द्वारा संबोधित हर चीज़ की सूची, और बाक़ी रूट का द्वार: जो ticker_id यहाँ से नहीं आता, वह बुक और सौदों पर 404 पाता है। kind प्लेटफ़ॉर्म के स्पॉट बाज़ार (spot) को परपेचुअल (perp) से अलग करता है; जब एक ही नाम दोनों को परोसता है, स्पॉट उसे रखता है। price_source आइटम में ही बताता है कि आँकड़ा कहाँ से आता है।

GET /api/public/pairs
[
  { "ticker_id": "BTC_USDT", "base": "BTC", "target": "USDT", "kind": "spot", "price_source": "offcode-perp" },
  { "ticker_id": "1000PEPE_USDT", "base": "1000PEPE", "target": "USDT", "kind": "perp", "price_source": "offcode-perp" }
]

टिकर — /tickers

हर spot जोड़ी के लिए भाव, 24 घंटे का वॉल्यूम, उच्च, निम्न और दोनों पक्ष। perp जोड़ियाँ शामिल नहीं हैं: यह वही हिस्सा है जिसका एग्रीगेटर मानक वर्णन करता है।

GET /api/public/tickers
[
  {
    "ticker_id": "BTC_USDT", "base_currency": "BTC", "target_currency": "USDT",
    "last_price": "…", "base_volume": "…", "target_volume": "…",
    "bid": "…", "ask": "…", "high": "…", "low": "…", "timestamp": 1756800000000
  }
]
ticker_idजोड़ी, BASE_TARGET रूप में।
base_currency · target_currencyजोड़ी की बेस मुद्रा और कोट मुद्रा, अलग-अलग।
last_priceपरपेचुअल पर अंतिम ट्रेड भाव।
base_volumeआधार मुद्रा में 24 घंटे का वॉल्यूम, जैसा वेन्यू प्रकाशित करते समय मापता है। केवल उसकी अनुपस्थिति में रूट target_volume को last_price से भाग देता है और 8 दशमलव तक नीचे काटता है — एक घोषित गणना, एक्सचेंज का आँकड़ा नहीं।
target_volumeकोट मुद्रा में 24 घंटे का वॉल्यूम, स्रोत से जैसा है वैसा।
bid · askदोनों एक-दूसरे के बराबर हैं और परपेचुअल के मिड प्राइस के बराबर हैं — ये ऑर्डर बुक के सर्वोत्तम खरीद और बिक्री भाव नहीं हैं। देखें डेटा कहाँ से आता है
high · lowपिछले 24 घंटे का उच्च और निम्न।
timestampरीडिंग का क्षण, Unix epoch से मिलीसेकंड में।

ऑर्डर बुक — /orderbook

एक जोड़ी की ऑर्डर बुक। bids और asks [price, size] जोड़े हैं, दोनों दशमलव स्ट्रिंग, सबसे अच्छा भाव पहले। timestamp स्रोत की घड़ी है, हमारी नहीं: स्थानीय घड़ी बासी बुक को ताज़ा मान लेने देती।

depth वैकल्पिक है और प्रति पक्ष 100 स्तरों तक जाता है। छोड़ने पर ऊपरी सीमा लौटती है: 100। बड़ा अनुरोध अस्वीकार नहीं होता — 100 पर काट दिया जाता है।

GET /api/public/orderbook?ticker_id=BTC_USDT&depth=100
{
  "ticker_id": "BTC_USDT",
  "timestamp": 1756800000000,
  "bids": [["…", "…"], ["…", "…"]],
  "asks": [["…", "…"], ["…", "…"]]
}

सौदे — /trades और /historical_trades

एक जोड़ी की हालिया टेप, नवीनतम सौदा पहले। दोनों रूट एक ही कार्यान्वयन और एक ही कैश हैं: एग्रीगेटर मानक historical_trades माँगता है, CCXT आम तौर पर trades माँगता है, और इस तरह कभी ऐसा दिन नहीं आता जब एक दूसरे से अलग जवाब दे।

type वैकल्पिक है (buy या sell, आक्रामक पक्ष के अनुसार) और limit 100 तक जाता है, अस्वीकार के बजाय काटा जाता है। type छोड़ने पर दोनों पक्ष लौटते हैं, और limit छोड़ने पर ऊपरी सीमा: 100। trade_id व्युत्पन्न है — क्षण, पक्ष, भाव और साइज़ — दो रीडिंग में एक ही सौदे के लिए स्थिर, और यह वेन्यू का अपना सौदा पहचानकर्ता नहीं है।

GET /api/public/trades?ticker_id=BTC_USDT&type=buy&limit=100
[
  { "trade_id": "…", "price": "…", "base_volume": "…", "target_volume": "…", "trade_timestamp": 1756800000000, "type": "buy" }
]

डेटा कहाँ से आता है

इस फ़ीड में भाव, बुक, सौदे और 24 घंटे का वॉल्यूम परपेचुअल बाज़ार से आते हैं — spot लेबल वाली जोड़ियों पर भी। OFFCODE के स्पॉट की अपनी कोई बुक नहीं है: वह उसी प्रतीक वाले परपेचुअल का मिड कोट करता है। इसीलिए हर /pairs आइटम में price_source होता है: फ़ीड इस्तेमाल करने वाला स्रोत फ़ीड में ही पढ़ता है, लेबल से अनुमान लगाने के बजाय — और ग़लत अनुमान लगाने के बजाय।

bid और ask एक ही मिड हैं। अपनी स्पॉट बुक नहीं है जिससे शीर्ष लिया जाए, इसलिए यहाँ ask − bid शून्य है। असली बुक में शून्य स्प्रेड असंभव है: इन दो फ़ील्ड को एक बुक के पक्ष न मानें।

base_volume परपेचुअल का आधार मुद्रा में 24 घंटे का वॉल्यूम है, जैसा वेन्यू प्रकाशित करते समय मापता है। केवल उसकी अनुपस्थिति में रूट target_volume को last_price से भाग देता है और 8 दशमलव तक नीचे काटता है — एक घोषित गणना, एक्सचेंज का आँकड़ा नहीं।

जोड़ी केवल वहीं प्रकाशित होती है जहाँ उसी प्रतीक का ट्रेड योग्य बाज़ार मौजूद हो: प्रकाशित करना परोसने का वादा है, और जो ticker_id /pairs से निकलता है उसे तुरंत बाद बुक और सौदों पर जवाब देना होता है। बिना ट्रेड योग्य जोड़ी वाला कस्टडी कॉइन फ़ीड से बाहर रहता है, और वह जोड़ी भी जिसके वेन्यू पर नाम में गुणक है — 1000PEPE_USDT परपेचुअल वैसा ही प्रकाशित होता है, कभी PEPE_USDT के रूप में नहीं।

सीमाएँ, कैश और CORS

प्रति IP प्रति मिनट 600 अनुरोध, हर रूट पर। इससे ऊपर 429 आता है।

2xx जवाब में Cache-Control: public, max-age=5 होता है; अन्य जवाबों में no-store होता है। ऐसा इसलिए है क्योंकि पाँच सेकंड तक कैश किया गया 404 किसी जोड़ी के सूचीबद्ध हो जाने के बाद भी उसे अनुपलब्ध बता सकता है, और कैश किया गया 502 वेन्यू के दोबारा चालू हो जाने के बाद भी उसे बंद दिखा सकता है।

नीचे, बुक प्रति जोड़ी और गहराई अधिकतम हर 350 ms में दोबारा पढ़ी जाती है, और सौदे प्रति जोड़ी हर 1 सेकंड में: वेन्यू को कॉल की ऊपरी सीमा कैश है, पूछने वालों की संख्या नहीं। विफल रीडिंग कभी कैश नहीं होती।

Access-Control-Allow-Origin: *, बिना क्रेडेंशियल — कोई कुकी, कुंजी या प्रमाणीकरण हेडर नहीं, और जवाब में कुछ भी व्यक्तिगत नहीं है।

त्रुटियाँ

कोडकब होता हैबॉडी
400ticker_id तय रूप से बाहर, ऐसा type जो न buy है न sell, ऐसा depth या limit जो पूर्णांक नहीं है{"code": "VALIDATION_ERROR", "message": "…"}
404सही रूप का ticker_id जो /pairs में नहीं है{"error": "UNKNOWN_TICKER"}
429इस IP के लिए अनुरोध सीमा से ऊपर{"statusCode": 429, "code": "RATE_LIMITED", "message": "…"}
502वेन्यू ने जवाब नहीं दिया, या विफलता के साथ दिया{"code": "UPSTREAM_UNAVAILABLE", "message": "…"}

500 नहीं, 502, जानबूझकर: वेन्यू पर विफलता हमारी विफलता नहीं है, और बाहर से पढ़ने वाले को यह अंतर चाहिए ताकि पता चले कि दोबारा कोशिश करना उचित है या नहीं।

एग्रीगेटर और स्वचालित पहुँच

डोमेन Cloudflare के पीछे है। ब्राउज़र पार हो जाता है; बिना कुकी की कमांड-लाइन कॉल को JSON के बजाय चुनौती मिल सकती है — यह रूट का इनकार नहीं है, एज पूछ रहा है कि कौन आया। अगर आपके रोबोट को फ़ीड लगातार खंगालनी है, तो क्रॉलर चालू करने से पहले अनुमति माँगें: user-agent, आउटबाउंड IP रेंज और अपेक्षित आवृत्ति संपर्क पर बताएँ।

शुल्क और ट्रेडिंग नियम इस API में नहीं हैं: वे /api/public/fees और शुल्क पर रहते हैं। सेवा की स्थिति प्लेटफ़ॉर्म की स्थिति पर है।