Skip to main content

Unified Python API for Indian stock exchanges (NSE + BSE)

Project description

dalal

PyPI version Python 3.11+ License: MIT Tests

Unified Python API for Indian stock exchanges (NSE + BSE).

No API keys. No third-party exchange wrappers. Just requests under the hood.

Install

pip install dalal

Quick Start

import dalal

dalal.quote("RELIANCE")                          # NSE (default)
dalal.quote("500325", exchange="BSE")            # BSE
dalal.fundamentals("500325")                     # 3-period financials
dalal.actions("RELIANCE")                        # dividends, splits, bonuses
dalal.history("RELIANCE", "2025-01-01", "2025-12-31")

Need explicit session control? Use the Dalal class directly with a context manager.

Features

Method NSE BSE Default Description
quote() Yes Yes NSE Live price, OHLC, 52-week range
history() Yes - NSE Historical OHLCV (auto-chunks 100-day windows)
actions() Yes Yes NSE Corporate actions — dividends, splits, bonuses
fundamentals() - Yes BSE 3-period results — Revenue, PAT, EPS, OPM%, NPM%
meta() - Yes BSE PE, ROE, EPS, P/B ratios
index() Yes - NSE Index constituents with live prices
holidays() Yes - NSE Trading/clearing holidays
bulk_deals() Yes - NSE Historical bulk deal data
block_deals() Yes - NSE Intraday block deals
shareholding() Yes - NSE Promoter/public/FII holding pattern
gainers() Yes Yes NSE Top gainers by index
losers() Yes Yes NSE Top losers by index
announcements() Yes Yes NSE Corporate announcements
status() Yes Yes NSE Market open/closed status
lookup() Yes Yes NSE Symbol search / autocomplete
result_calendar() - Yes BSE Upcoming earnings dates
advances() Yes - NSE Advance/decline ratio

Usage

Quotes

import dalal

nse = dalal.quote("RELIANCE")
# {'symbol': 'RELIANCE', 'ltp': 1365.1, 'open': 1360.0, 'high': 1370.0,
#  'low': 1340.0, 'prev_close': 1350.0, 'year_high': 1600.0, ...}

bse = dalal.quote("500325", exchange="BSE")
# {'scripcode': '500325', 'ltp': 1365.1, 'open': 1340.0, ...}

Historical Data

import dalal

data = dalal.history("RELIANCE", "2025-01-01", "2025-06-30")
# [{'date': '2025-01-02', 'open': 1300.0, 'high': 1320.0,
#   'low': 1290.0, 'close': 1310.0, 'volume': 5000000.0}, ...]

# Works with pandas
import pandas as pd
df = pd.DataFrame(data)

Fundamentals (BSE)

import dalal

f = dalal.fundamentals("500325")
# {'scripcode': '500325', 'currency_unit': 'in Cr.',
#  'periods': [
#    {'period': 'Dec-25', 'revenue': 125741.0, 'net_profit': 9396.0,
#     'eps': 6.94, 'opm_pct': 14.56, 'npm_pct': 7.47},
#    {'period': 'Sep-25', ...},
#    {'period': 'FY24-25', ...}
#  ]}

m = dalal.meta("500325")
# {'eps': 35.21, 'pe': 38.77, 'roe': 9.09, 'pb': 3.52, ...}

Corporate Actions

import dalal

actions = dalal.actions("RELIANCE")
# [{'symbol': 'RELIANCE', 'subject': 'Dividend - Rs 5.5 Per Share',
#   'ex_date': '2025-08-14', ...},
#  {'symbol': 'RELIANCE', 'subject': 'Bonus 1:1',
#   'ex_date': '2024-10-28', ...}]

Index Constituents

import dalal

nifty = dalal.index("NIFTY 50")
# {'name': 'NIFTY 50', 'advance': 30, 'decline': 20,
#  'constituents': [
#    {'symbol': 'RELIANCE', 'ltp': 1365.0, 'pct_change': 1.12, ...},
#    ...
#  ]}

Error Handling

import dalal
from dalal import SymbolNotFound, RateLimited, NetworkError

try:
    dalal.quote("INVALID")
except SymbolNotFound:
    print("Symbol not found")
except RateLimited:
    print("Too many requests — slow down")
except NetworkError:
    print("Connection issue")

All exceptions inherit from DalalError:

DalalError
├── ExchangeError
│   ├── AuthError
│   ├── SymbolNotFound
│   └── DataNotAvailable
├── NetworkError
│   ├── RateLimited
│   └── ExchangeDown
└── ValidationError

Rate Limiting

Built-in rate limiting prevents IP bans:

  • NSE: 3 requests/second
  • BSE: 8 requests/second

Override if needed:

d = Dalal(nse_rate=2, bse_rate=5)

How It Works

dalal talks directly to the same APIs that nseindia.com and bseindia.com use internally. No API keys needed — it handles browser impersonation and cookie management automatically.

  • NSE: Cookie-primed session (auto-refreshes on 401)
  • BSE: Simple session with browser-like headers
  • Sessions are lazy: NSE session only created on first NSE call, same for BSE

Requirements

  • Python 3.11+
  • requests >= 2.31

License

MIT

Author

Aman (@onlyoneaman)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dalal-0.1.2.tar.gz (13.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dalal-0.1.2-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file dalal-0.1.2.tar.gz.

File metadata

  • Download URL: dalal-0.1.2.tar.gz
  • Upload date:
  • Size: 13.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for dalal-0.1.2.tar.gz
Algorithm Hash digest
SHA256 4bc752420d67d1cf0c48497d8ebf03ecb6721764a4a59eafc26fb169ebf4b2d6
MD5 edb1336d44e0f6fe664856f907c8f9a0
BLAKE2b-256 78bc9f90a4f1f9737b70d324e3640781340e154726b21305dfaa993a515e01d4

See more details on using hashes here.

File details

Details for the file dalal-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: dalal-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for dalal-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 00ba6d5bfdf0b8438b3aab5a2886af296d706f1af63502ba386d73505d1633c9
MD5 f892efa1beb25637be09a714d53859d0
BLAKE2b-256 2cecd0b0aa536fd32ee976a9b24b0443f49f9050f253d041835cf8eea4b0263f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page