Browser WebSocket
नेटिव WebSocket API का उपयोग करके वेब ब्राउज़र से सीधे finlight.me WebSocket API से कनेक्ट करें। यह डैशबोर्ड, ट्रेडिंग टर्मिनल और किसी भी फ्रंटएंड एप्लिकेशन के लिए आदर्श है जिसे सर्वर-साइड प्रॉक्सी के बिना रीयल-टाइम लेख अपडेट की आवश्यकता होती है।
ब्राउज़र WebSocket API कस्टम हेडर का समर्थन नहीं करता। प्रमाणीकरण x-api-key हेडर के बजाय क्वेरी पैरामीटर के माध्यम से संभाला जाता है। आपकी API कुंजी WebSocket URL में दिखाई देगी — इस तरीके का उपयोग केवल उन वातावरणों में करें जहाँ यह स्वीकार्य हो (जैसे, प्रमाणित डैशबोर्ड)। सार्वजनिक रूप से सुलभ क्लाइंट-साइड कोड में अपनी API कुंजी कभी उजागर न करें।
यह कैसे काम करता है
- अपनी API कुंजी को क्वेरी पैरामीटर के रूप में देकर
wss://wss.finlight.me(एनरिच्ड) याwss://wss.finlight.me/raw(raw) से कनेक्ट करें - अपने फ़िल्टर मानदंड और एक
clientNonceके साथ JSON संदेश भेजकर सदस्यता लें - अपने कनेक्शन की पुष्टि करने वाला एक
admitसंदेश प्राप्त करें, उसके बाद लेख आने परsendArticleसंदेश - हर 25 सेकंड में
pingसंदेश भेजकर कनेक्शन बनाए रखें ws.close()कॉल करके डिस्कनेक्ट करें
कनेक्शन URL
- Name
एनरिच्ड- Type
- wss://wss.finlight.me
- Description
पूर्ण संवर्धन वाले लेख: सेंटिमेंट विश्लेषण, इकाई निष्कर्षण, श्रेणियाँ और पूर्ण कंटेंट (आपके सब्सक्रिप्शन स्तर के आधार पर)।
- Name
Raw- Type
- wss://wss.finlight.me/raw
- Description
संवर्धन के बिना कम-विलंबता वाले raw लेख। उन उपयोग-मामलों के लिए सर्वोत्तम जहाँ गति सबसे पहले है और आपको लेख यथासंभव तेज़ी से चाहिए।
क्वेरी पैरामीटर
- Name
apiKey- Type
- string
- Description
आपकी finlight API कुंजी। प्रमाणीकरण के लिए उपयोग की जाती है क्योंकि ब्राउज़र WebSocket कस्टम हेडर सेट नहीं कर सकता।
- Name
takeover- Type
- string
- Description
जब आपकी समवर्ती कनेक्शन सीमा पहुँच जाए तो सबसे पुराने कनेक्शन को स्वतः बदलने के लिए
"true"पर सेट करें।
- Name
clientVersion- Type
- string
- Description
आपके क्लाइंट एप्लिकेशन के लिए वैकल्पिक पहचानकर्ता। जैसे
"my-dashboard/1.0"
सदस्यता संदेश
कनेक्शन खुलने के बाद, लेखों की सदस्यता लेने के लिए एक JSON संदेश भेजें। सर्वर एक admit संदेश के साथ प्रतिक्रिया देगा, फिर मेल खाने वाले लेख पुश करना शुरू करेगा।
- Name
clientNonce- Type
- string
- Description
इस सदस्यता अनुरोध के लिए एक अद्वितीय पहचानकर्ता (जैसे, UUID)। सर्वर इसे
admitप्रतिक्रिया में वापस भेजता है।
- Name
query- Type
- string
- Description
प्रासंगिक लेख खोजने के लिए खोज क्वेरी। उन्नत क्वेरीज़ का समर्थन करती है।
- Name
sources- Type
- string[]
- Description
स्रोत डोमेन के अनुसार फ़िल्टर करें। जैसे
["www.reuters.com", "www.cnbc.com"]
- Name
excludeSources- Type
- string[]
- Description
विशिष्ट स्रोत डोमेन को बाहर रखता है।
- Name
tickers- Type
- string[]
- Description
टिकर प्रतीकों के अनुसार फ़िल्टर करें। जैसे
["AAPL", "NVDA"](केवल एनरिच्ड)
- Name
countries- Type
- string[]
- Description
ISO 3166-1 alpha-2 में देश कोड के अनुसार फ़िल्टर करें। जैसे
["US", "DE"](केवल एनरिच्ड)
- Name
language- Type
- string
- Description
भाषा के अनुसार फ़िल्टर करें (ISO 639-1)। डिफ़ॉल्ट
enहै, जो केवल अंग्रेज़ी लौटाता है और अन्य भाषाओं को बाहर रखता है — भाषा और कवरेज देखें।
सर्वर संदेश
सर्वर एक action फ़ील्ड वाले JSON संदेश भेजता है जो संदेश के प्रकार को दर्शाता है:
- Name
admit- Type
- object
- Description
सफल हैंडशेक के बाद भेजा जाता है। इसमें
leaseId,serverNow(टाइमस्टैम्प) और आपकाclientNonceहोता है।
- Name
sendArticle- Type
- object
- Description
आपकी सदस्यता से मेल खाने वाला एक नया लेख। लेख डेटा
dataफ़ील्ड में होता है।
- Name
pong- Type
- object
- Description
आपकी
pingहार्टबीट की प्रतिक्रिया।
- Name
preempted- Type
- object
- Description
आपका कनेक्शन किसी अन्य सत्र द्वारा बदल दिया गया (जब कोई अन्य क्लाइंट
takeover: trueके साथ कनेक्ट हुआ)।
- Name
error- Type
- object
- Description
एक त्रुटि हुई। विवरण के लिए
dataयाerrorफ़ील्ड जाँचें।
पूर्ण उदाहरण
स्वचालित पुनः कनेक्शन और हार्टबीट के साथ एक न्यूनतम, फ्रेमवर्क-अज्ञेय ब्राउज़र WebSocket क्लाइंट:
- क्वेरी पैरामीटर के माध्यम से प्रमाणित करता है
- कनेक्ट होने पर एक सदस्यता संदेश भेजता है
- 25-सेकंड का हार्टबीट अंतराल बनाए रखता है
- एक्सपोनेंशियल बैकऑफ़ (500ms से 10s) के साथ पुनः कनेक्ट करता है
- सभी सर्वर संदेश प्रकारों को संभालता है
Browser Client
const API_KEY = 'YOUR_API_KEY'
const WSS_URL = 'wss://wss.finlight.me' // Use '/raw' path for raw articles
let ws = null
let pingInterval = null
let reconnectTimeout = null
let reconnectAttempt = 0
function connect(filters = {}) {
const params = new URLSearchParams({
apiKey: API_KEY,
takeover: 'true',
clientVersion: 'my-app/1.0',
})
const url = `${WSS_URL}?${params}`
ws = new WebSocket(url)
ws.onopen = () => {
console.log('Connected')
reconnectAttempt = 0
// Send subscription with filters
ws.send(JSON.stringify({
clientNonce: crypto.randomUUID(),
query: filters.query || '',
language: filters.language || 'en',
sources: filters.sources || [],
tickers: filters.tickers || [],
countries: filters.countries || [],
}))
// Start heartbeat
pingInterval = setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({
action: 'ping',
t: Date.now(),
}))
}
}, 25000)
}
ws.onmessage = (event) => {
const msg = JSON.parse(event.data)
switch (msg.action) {
case 'admit':
console.log('Admitted, lease:', msg.leaseId)
break
case 'sendArticle':
console.log('Article:', msg.data.title)
// Handle the article here
break
case 'pong':
break // Heartbeat OK
case 'preempted':
console.warn('Connection replaced')
break
case 'error':
console.error('Server error:', msg.data || msg.error)
break
}
}
ws.onclose = (event) => {
clearInterval(pingInterval)
// Don't reconnect on policy violations
if (event.code === 1008 || event.code === 4002) {
console.error('Connection blocked')
return
}
// Exponential backoff reconnect
const delay = Math.min(500 * 2 ** reconnectAttempt, 10000)
reconnectAttempt++
console.log(`Reconnecting in ${delay}ms...`)
reconnectTimeout = setTimeout(() => connect(filters), delay)
}
ws.onerror = () => console.error('WebSocket error')
}
function disconnect() {
clearInterval(pingInterval)
clearTimeout(reconnectTimeout)
if (ws) ws.close(1000)
}
// Usage
connect({ query: 'Nvidia', language: 'en', countries: ['US'] })
admit Response
{
"action": "admit",
"leaseId": "a1b2c3d4-e5f6-4789-abcd-ef0123456789",
"serverNow": 1708185600000,
"clientNonce": "your-uuid-here"
}
sendArticle Response
{
"action": "sendArticle",
"data": {
"link": "https://www.reuters.com/technology/nvidia-2026-02-17",
"source": "www.reuters.com",
"title": "Nvidia Reports Record Revenue",
"summary": "Nvidia announced record quarterly revenue...",
"publishDate": "2026-02-17T10:30:00Z",
"language": "en",
"sentiment": "positive",
"confidence": 0.92,
"countries": ["US"],
"categories": ["markets", "technology"],
"companies": [
{
"name": "NVIDIA Corporation",
"ticker": "NVDA",
"country": "US"
}
]
}
}
एनरिच्ड बनाम Raw
| सुविधा | एनरिच्ड (/) | Raw (/raw) |
|---|---|---|
| सेंटिमेंट विश्लेषण | हाँ | नहीं |
| इकाई निष्कर्षण (कंपनियाँ) | हाँ (स्तर पर निर्भर) | नहीं |
| श्रेणियाँ | हाँ | नहीं |
| पूर्ण कंटेंट | हाँ (स्तर पर निर्भर) | नहीं |
| विलंबता | मानक | सबसे कम |
फ़िल्टर: tickers | हाँ | नहीं |
फ़िल्टर: countries | हाँ | नहीं |
फ़िल्टर: query, sources, language | हाँ | हाँ |
Raw WebSocket सदस्यताएँ केवल query, sources, excludeSources और language फ़िल्टर का समर्थन करती हैं। raw एंडपॉइंट पर टिकर और देश फ़िल्टर चुपचाप अनदेखा कर दिए जाते हैं।
आगे क्या?
- पूर्ण लेख मॉडल और सभी उपलब्ध फ़ील्ड के लिए एनरिच्ड सदस्यता पृष्ठ देखें
- raw-विशिष्ट विवरण के लिए Raw सदस्यता देखें
- अपने फ़िल्टर परिष्कृत करने के लिए उन्नत क्वेरी निर्माण के बारे में जानें
- अपनी रीयल-टाइम स्ट्रीम के साथ-साथ ऐतिहासिक लेख खोज के लिए REST API का उपयोग करें