Drishti SDK (Python)
Official Python SDK for the Manasija Drishti API (/v1).
This SDK provides:
- A synchronous HTTP client with named-argument endpoint helpers
- A low-level request interface for advanced/custom usage
- A WebSocket client for real-time streams (
/v1/ws) - Configurable retry/backoff for transient HTTP failures
Requirements
- Python
3.10+ - A valid Drishti API key
Installation
pip install drishti-sdk
Quick Start
from drishti_sdk import DrishtiClient
with DrishtiClient(api_key="YOUR_API_KEY") as client:
news = client.get_news(
symbols=["RELIANCE", "TCS"],
limit=10,
)
print(len(news["data"]))
All requests automatically include X-API-Key using the provided api_key.
Retry Configuration
Retries are configurable globally on the client and per request.
from drishti_sdk import DrishtiClient
with DrishtiClient(
api_key="YOUR_API_KEY",
retry_max_retries=3,
retry_initial_delay=0.25,
retry_max_delay=4.0,
retry_multiplier=2.0,
retry_on_statuses=(408, 429, 500, 502, 503, 504),
) as client:
# Per-request override
news = client.request(
"GET",
"/v1/news",
params={"limit": 10},
retry_max_retries=1,
)
HTTP Usage
from drishti_sdk import DrishtiClient
with DrishtiClient(api_key="YOUR_API_KEY") as client:
announcements = client.get_announcements(
symbols=["RELIANCE"],
categories=["Corporate Action"],
important=True,
detailed=True,
limit=20,
)
earnings = client.get_earnings_detail(
symbol="MEDIASSIST",
quarter="q4_26",
detailed=True,
)
earnings_rows = client.get_earnings(
ids=["67c2f8a1b2c3d4e5f6a7b8d0"],
limit=5,
)
transcript = client.get_concalls_transcript(
symbol="TCS",
quarter="q4_26",
)
alerts = client.get_alerts(
symbols=["INFY"],
important=True,
limit=25,
)
Error Handling
from drishti_sdk import DrishtiApiError, DrishtiClient
try:
with DrishtiClient(api_key="YOUR_API_KEY") as client:
client.get_account()
except DrishtiApiError as exc:
print(exc.status_code)
print(exc.body)
raise
WebSocket Usage (/v1/ws)
Event listeners
import asyncio
from drishti_sdk import DrishtiClient
async def main() -> None:
client = DrishtiClient(api_key="YOUR_API_KEY")
async with client.websocket(
reconnect_initial_delay=1.0,
reconnect_max_delay=30.0,
on_reconnect_attempt=lambda attempt, delay, reason: print(attempt, delay, reason),
on_data=lambda event: print(event.data) if event.kind == "data" else None,
on_announcements=lambda announcement: print("announcement", announcement),
on_alerts=lambda alert: print("alert", alert),
) as ws:
await ws.subscribe("alerts", symbols=["RELIANCE"])
await asyncio.Event().wait() # listeners run in the background; Ctrl+C to stop
asyncio.run(main())
Async iterator style
async with client.websocket() as ws:
await ws.subscribe("announcements", symbols=["RELIANCE"], detailed=False)
async for event in ws.events():
if event.kind == "subscribed":
print("ready", event.product, event.tier)
elif event.kind == "data":
print(event.channel, event.data)
Register listeners after connect:
def on_announcement(announcement: dict[str, object]) -> None:
print("announcement", announcement)
ws.on_announcements(on_announcement)
ws.off("announcements", on_announcement)
WebSocket Reference
The WebSocket session is created from the HTTP client, so it inherits the same
api_key and base_url settings. The session connects to /v1/ws and sends
X-API-Key on connect.
Supported subscription products:
newsannouncementsearningsconcallsalerts
Useful session options:
reconnect_initial_delayreconnect_max_delayreconnect_backoff_multiplierreconnect_jitter_ratioreconnect_warn_after_attemptsping_intervalping_timeoutopen_timeoutclose_timeoutmax_queueon_subscribedon_dataon_newson_announcementson_earningson_concallson_alertson_erroron_messageon_openon_closeon_reconnect_attempton_reconnect_warning
The session connects automatically on the first async call (subscribe,
events, or entering an async with block) and keeps retrying in the
background after disconnects.
Subscription messages accept either SubscribeOptions(...) or the product name
as a string. Symbols are normalized to uppercase and de-duplicated before the
message is sent. Subscriptions are replayed after every reconnect.
Event shapes:
subscribed: acknowledgement withproduct,tier,full_feed,symbols, anddetaileddata: payload event withchannelanddataerror: error event withmessageand optionalcoderaw: unclassified JSON payload
Direct exports available from drishti_sdk:
DRISHTI_WS_PRODUCTSSubscribeOptionsDrishtiWebSocketSessionDrishtiWebSocketClientSessionOptionsDataEventErrorEventRawEventSubscribedEventWebSocketEventbuild_websocket_urlparse_websocket_messagestream_product
Batch Jobs
from drishti_sdk import DrishtiClient
with DrishtiClient(api_key="YOUR_API_KEY") as client:
with open("batch.jsonl", "rb") as f:
file_bytes = f.read()
job = client.post_batch_jobs_file(
file_name="batch.jsonl",
file_bytes=file_bytes,
display_name="Quarterly run",
)
status = client.get_batch_jobs_job_id(job_id=job["id"])
Wait until completion:
final_job = client.wait_for_batch_job_completion(
job_id=job["id"],
poll_interval=2.0,
timeout=300.0,
)
Submit and wait in one call:
final_job = client.submit_batch_job_and_wait(
file_name="batch.jsonl",
file_bytes=file_bytes,
display_name="Quarterly run",
poll_interval=2.0,
timeout=300.0,
)
API Surface
REST helper methods
get_newsget_symbols_metadataget_announcements_categoriesget_announcementsget_announcements_attachmentsget_announcement_citation_pdfpost_daily_summaryget_earningsget_earnings_detailget_earnings_attachmentsget_earnings_citation_pdfget_earnings_citation_pageget_upcoming_earningsget_concallsget_concall_citation_pdfget_upcoming_concallsget_concalls_detailget_concalls_transcriptpost_concalls_transcriptsget_alertsget_accountget_account_limitsget_account_usageget_account_ledgerpost_batch_jobspost_batch_jobs_fileget_batch_jobsget_batch_jobs_job_iddelete_batch_jobs_job_idget_batch_jobs_job_id_resultswait_for_batch_job_completionsubmit_batch_job_and_waitwebsocket
Low-level HTTP methods
requestgetpostputpatchdeleterequest_v1
Development
pip install -e .[dev]
Metadata
Release files for drishti-sdk 1.0.10
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| drishti_sdk-1.0.10.tar.gz | 17.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| drishti_sdk-1.0.10-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.0 kB
Release files / drishti_sdk-1.0.10.tar.gz
| Download URL | drishti_sdk-1.0.10.tar.gz |
|---|---|
| Size | 17.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1ff7444f0f9685bc837970d3ffc3510a4a5fd3f999954af704f2d398993b4db4
|
|
BLAKE2b-256 checksum How to use checksums |
4ea4754ea10eae5ddee1491f0d0a723548c66398db30066be221e2bcbb679d74
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.
Transparency logRelease files / drishti_sdk-1.0.10-py3-none-any.whl
| Download URL | drishti_sdk-1.0.10-py3-none-any.whl |
|---|---|
| Size | 20.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
47158466911cb176ae517a38557eb013c01881ce1ea4740d737b09375d4fd3ba
|
|
BLAKE2b-256 checksum How to use checksums |
5c7b610c090ed655a9bea3468571b7a79f6fb6331e761484e1aa046c5d11a537
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 10, 2026.
Transparency log