A comprehensive Python client for Nepal Stock Exchange (NEPSE) API
Project description
NEPSE Client
A comprehensive, production-ready Python client library for interacting with the Nepal Stock Exchange (NEPSE) API. Built with modern Python best practices, full type hints, and both synchronous and asynchronous support.
๐ Features
- โจ Dual API Support - Both synchronous and asynchronous clients for flexible integration
- ๐ Smart Token Management - Automatic authentication with token refresh and caching
- ๐ Complete API Coverage - Access all NEPSE endpoints: market data, company info, floor sheets, news, and more
- ๐ก๏ธ Robust Error Handling - Comprehensive exception hierarchy with automatic retries
- ๐ Full Type Hints - Complete type annotations for excellent IDE support and type safety
- ๐ Automatic Retry Logic - Built-in exponential backoff for network failures
- ๐ Progress Tracking - Optional progress bars for long-running operations
- ๐งช Well Tested - Comprehensive test suite with >80% coverage
- ๐ Production Ready - Battle-tested, secure, and optimized for performance
- ๐ Excellent Documentation - Detailed docs, examples, and API reference
๐ฆ Installation
From PyPI (Recommended)
pip install nepse-client
Using uv (Fast)
uv pip install nepse-client
From Source
git clone https://github.com/4mritgiri/NepseClient.git
cd nepse-client
pip install -e .
Development Installation
# Clone and install with dev dependencies
git clone https://github.com/4mritgiri/NepseClient.git
cd nepse-client
pip install -e ".[dev]"
# Install pre-commit hooks
pre-commit install
๐ Quick Start
Synchronous Usage
from nepse_client import NepseClient
# Initialize client
client = NepseClient()
# Optional: Disable TLS verification (for testing only)
client.setTLSVerification(False)
# Get market status
market_status = client.getMarketStatus()
print(f"Market is: {market_status['isOpen']}")
# Get company details
nabil = client.getCompanyDetails('NABIL')
print(f"NABIL LTP: {nabil['lastTradedPrice']}")
# Get today's top gainers
gainers = client.getTopGainers()
for stock in gainers[:5]:
print(f"{stock['symbol']}: +{stock['percentageChange']}%")
Asynchronous Usage
import asyncio
from nepse_client import AsyncNepseClient
async def main():
# Initialize async client
async with AsyncNepseClient() as client:
# Optional: Disable TLS verification (for testing only)
client.setTLSVerification(False)
# Concurrent requests for better performance
market_status, summary, gainers = await asyncio.gather(
client.getMarketStatus(),
client.getSummary(),
client.getTopGainers()
)
print(f"Market: {market_status['isOpen']}")
print(f"Turnover: {summary['totalTurnover']}")
print(f"Top Gainer: {gainers[0]['symbol']}")
# Run async function
asyncio.run(main())
Context Manager Support
# Automatic resource cleanup with context manager
with NepseClient() as client:
status = client.getMarketStatus()
companies = client.getCompanyList()
# Client automatically closed
๐ API Documentation
Market Information
# Get market status (open/closed)
status = client.getMarketStatus()
# Get market summary (turnover, trades, etc.)
summary = client.getSummary()
# Get NEPSE index
index = client.getNepseIndex()
# Get sub-indices (sector indices)
sub_indices = client.getNepseSubIndices()
# Get live market data
live_market = client.getLiveMarket()
# Get price volume data
price_volume = client.getPriceVolume()
# Get supply and demand data
supply_demand = client.getSupplyDemand()
Company Information
# Get list of all companies
companies = client.getCompanyList()
# Get security list (non-delisted securities)
securities = client.getSecurityList()
# Get company details by symbol
details = client.getCompanyDetails('NABIL')
# Get company price history
from datetime import date, timedelta
end_date = date.today()
start_date = end_date - timedelta(days=365)
history = client.getCompanyPriceVolumeHistory(
symbol='NABIL',
start_date=start_date,
end_date=end_date
)
# Get daily price graph data
graph = client.getDailyScripPriceGraph('NABIL')
# Get company financial details
financials = client.getCompanyFinancialDetails(company_id='123')
# Get company AGM information
agm = client.getCompanyAGM(company_id='123')
# Get company dividend information
dividend = client.getCompanyDividend(company_id='123')
# Get company market depth
market_depth = client.getCompanyMarketDepth(company_id='123')
Trading Data
# Get complete floor sheet (all trades)
floor_sheet = client.getFloorSheet()
# Get floor sheet with progress bar
floor_sheet = client.getFloorSheet(show_progress=True)
# Get floor sheet for specific company
company_trades = client.getFloorSheetOf(
symbol='NABIL',
business_date='2024-01-15'
)
# Get trading average
trading_avg = client.getTradingAverage(
business_date='2024-01-15',
nDays=180
)
# Get market depth for symbol
depth = client.getSymbolMarketDepth('NABIL')
Top Performers
# Get top gainers
gainers = client.getTopGainers()
# Get top losers
losers = client.getTopLosers()
# Get top 10 by trade volume
top_trade = client.getTopTenTradeScrips()
# Get top 10 by transaction count
top_transaction = client.getTopTenTransactionScrips()
# Get top 10 by turnover
top_turnover = client.getTopTenTurnoverScrips()
News and Announcements
# Get company news with pagination
news = client.getCompanyNewsList(
page=1,
page_size=100,
is_strip_tags=True # Remove HTML tags
)
# Get news and alerts
alerts = client.getNewsAndAlertList(
page=1,
page_size=100,
is_strip_tags=True
)
# Get press releases
press_releases = client.getPressRelease()
# Get NEPSE notices
notices = client.getNepseNotice(page=0)
Other Data
# Get holiday list for specific year
holidays = client.getHolidayList(year=2025)
# Get debenture and bond list
debentures = client.getDebentureAndBondList(type='debenture')
bonds = client.getDebentureAndBondList(type='bond')
# Get price volume history for specific date
price_history = client.getPriceVolumeHistory(business_date='2024-01-15')
Advanced Features
Caching and ID Mappings
# Get company ID to symbol mapping (cached)
company_map = client.getCompanyIDKeyMap()
# Get security ID to symbol mapping (cached)
security_map = client.getSecurityIDKeyMap()
# Force update cache
company_map = client.getCompanyIDKeyMap(force_update=True)
# Get sector-wise scrips
sector_scrips = client.getSectorScrips()
# Returns: {'Commercial Banks': ['NABIL', 'SCB', ...], ...}
Custom Configuration
import logging
# Custom logger
logger = logging.getLogger('my_nepse_app')
logger.setLevel(logging.DEBUG)
# Initialize with custom settings
client = NepseClient(
logger=logger,
mask_request_data=True, # Mask sensitive data in logs
timeout=120.0 # Request timeout in seconds
)
# Disable TLS verification (not recommended for production)
client.setTLSVerification(False)
# Re-enable TLS verification
client.setTLSVerification(True)
๐ฅ Advanced Usage Examples
Portfolio Value Calculator
def calculate_portfolio_value(portfolio):
"""
Calculate total portfolio value.
Args:
portfolio: Dict of {symbol: quantity}
Returns:
Total value in NPR
"""
client = NepseClient()
total = 0
for symbol, quantity in portfolio.items():
details = client.getCompanyDetails(symbol)
price = float(details['lastTradedPrice'])
value = price * quantity
total += value
print(f"{symbol}: {quantity} @ NPR {price} = NPR {value:,.2f}")
return total
# Example
portfolio = {'NABIL': 100, 'NICA': 50, 'SCB': 75}
total_value = calculate_portfolio_value(portfolio)
print(f"\nTotal Portfolio Value: NPR {total_value:,.2f}")
Async Batch Operations
import asyncio
from nepse_client import AsyncNepseClient
async def fetch_multiple_companies(symbols):
"""Fetch details for multiple companies concurrently."""
async with AsyncNepseClient() as client:
# Create tasks for all symbols
tasks = [client.getCompanyDetails(symbol) for symbol in symbols]
# Fetch all concurrently
results = await asyncio.gather(*tasks, return_exceptions=True)
# Process results
for symbol, result in zip(symbols, results):
if isinstance(result, Exception):
print(f"{symbol}: Error - {result}")
else:
ltp = result['lastTradedPrice']
print(f"{symbol}: NPR {ltp}")
# Run
symbols = ['NABIL', 'NICA', 'SCB', 'EBL', 'ADBL']
asyncio.run(fetch_multiple_companies(symbols))
Real-time Market Monitoring
import asyncio
from nepse_client import AsyncNepseClient
async def monitor_market(interval=60):
"""Monitor market status continuously."""
async with AsyncNepseClient() as client:
while True:
try:
status = await client.getMarketStatus()
summary = await client.getSummary()
print(f"[{status['asOf']}] Market: {status['isOpen']}")
print(f"Turnover: NPR {summary['totalTurnover']:,.2f}")
await asyncio.sleep(interval)
except KeyboardInterrupt:
break
except Exception as e:
print(f"Error: {e}")
await asyncio.sleep(interval)
asyncio.run(monitor_market())
๐ Error Handling
The library provides a comprehensive exception hierarchy:
from nepse_client import (
NepseError, # Base exception
NepseClientError, # 400 errors
NepseAuthenticationError, # 401 errors
NepseBadGatewayError, # 502 errors
NepseServerError, # 5xx errors
NepseNetworkError, # Network/connection errors
NepseValidationError, # Input validation errors
NepseRateLimitError, # Rate limit exceeded
NepseDataNotFoundError, # Data not found
NepseTimeoutError, # Request timeout
)
# Example error handling
try:
data = client.getCompanyDetails('INVALID')
except NepseAuthenticationError:
print("Authentication failed - token will auto-refresh")
except NepseDataNotFoundError:
print("Company symbol not found")
except NepseRateLimitError as e:
print(f"Rate limited - retry after {e.retry_after}s")
except NepseServerError as e:
print(f"Server error: {e}")
except NepseError as e:
print(f"NEPSE error: {e}")
๐งช Testing
# Install test dependencies
pip install -e ".[dev]"
# Run all tests
pytest
# Run with coverage
pytest --cov=nepse_client --cov-report=html
# Run specific test file
pytest tests/test_sync_client.py -v
# Run only unit tests
pytest -m unit
# Run only integration tests
pytest -m integration
๐ Code Quality
This project maintains high code quality standards:
# Format code
black nepse_client tests examples
isort nepse_client tests examples
# Lint code
flake8 nepse_client tests --max-line-length=100
# Type check
mypy nepse_client --ignore-missing-imports
# Security check
bandit -r nepse_client
# Run all pre-commit hooks
pre-commit run --all-files
๐๏ธ Project Structure
nepse-client/
โโโ nepse_client/ # Main package
โ โโโ __init__.py # Package exports
โ โโโ client.py # Base client
โ โโโ sync_client.py # Sync implementation
โ โโโ async_client.py # Async implementation
โ โโโ token_manager.py # Token management
โ โโโ dummy_id_manager.py # Dummy ID management
โ โโโ exceptions.py # Custom exceptions
โ โโโ py.typed # Type hint marker
โ โโโ data/ # Configuration files
โโโ tests/ # Test suite
โโโ examples/ # Usage examples
โโโ docs/ # Documentation
โโโ .github/ # GitHub Actions
โ โโโ workflows/ # CI/CD pipelines
โ โโโ ISSUE_TEMPLATE/ # Issue templates
โโโ pyproject.toml # Project config
โโโ README.md # This file
๐ค Contributing
We welcome contributions! Please follow these guidelines:
Getting Started
- Fork the repository
- Clone your fork:
git clone https://github.com/yourusername/nepse-client.git - Create a branch:
git checkout -b feature/amazing-feature - Install dev dependencies:
pip install -e ".[dev]" - Install pre-commit:
pre-commit install
Making Changes
- Make your changes
- Add tests for new functionality
- Run tests:
pytest - Run code quality checks:
pre-commit run --all-files - Commit:
git commit -m 'Add amazing feature' - Push:
git push origin feature/amazing-feature - Create a Pull Request
Code Standards
- Follow PEP 8 style guide
- Use Black for formatting (line length: 100)
- Add type hints to all functions
- Write docstrings (Google style)
- Maintain test coverage above 80%
- Update documentation for new features
Pull Request Checklist
- Tests pass locally
- Code formatted with Black and isort
- Type hints added
- Documentation updated
- CHANGELOG.md updated
- No linting errors
- Test coverage maintained
See CONTRIBUTING.md for detailed guidelines.
๐ Development
Setup Development Environment
# Clone repository
git clone https://github.com/4mritgiri/NepseClient.git
cd nepse-client
# Create virtual environment (recommended)
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Install in development mode
pip install -e ".[dev]"
# Install pre-commit hooks
pre-commit install
# Verify installation
pytest --version
black --version
Running Tests
# Run all tests
pytest
# Run with coverage report
pytest --cov=nepse_client --cov-report=term-missing
# Run specific test
pytest tests/test_sync_client.py::test_get_market_status
# Run in watch mode (requires pytest-watch)
ptw
Building Documentation
# Install documentation dependencies
pip install sphinx sphinx-rtd-theme
# Build HTML docs
cd docs
make html
# Open in browser
open _build/html/index.html # macOS
xdg-open _build/html/index.html # Linux
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- Nepal Stock Exchange for providing the API
- All contributors who have helped improve this library
- The Python community for excellent tools and libraries
๐จโ๐ป Author
Amrit Giri
- GitHub: @4mritgiri
- Email: amritgiri.dev@gmail.com
๐ Links
- ๐ฆ PyPI Package
- ๐ Documentation
- ๐ Issue Tracker
- ๐ฌ Discussions
- ๐ Changelog
- ๐ค Contributing Guide
๐ Project Stats
๐ Support
If you find this library helpful, please consider:
- โญ Starring the repository
- ๐ Reporting bugs and issues
- ๐ก Suggesting new features
- ๐ค Contributing code improvements
- ๐ข Sharing with others
๐บ๏ธ Roadmap
- WebSocket support for real-time data
- Data export utilities (CSV, Excel, JSON)
- Advanced filtering and sorting
- Rate limiting with automatic backoff
- Caching layer for repeated requests
- CLI tool for quick queries
- Django/Flask integration examples
- Interactive Jupyter notebook examples
โ FAQ
Q: Is this library official?
A: No, this is an unofficial client library for the NEPSE API.
Q: Do I need an API key?
A: No, the NEPSE API doesn't require authentication keys. The client handles token management automatically.
Q: Can I use this in production?
A: Yes! The library is production-ready with comprehensive error handling, retries, and logging.
Q: Which Python versions are supported?
A: Python 3.8 and above are supported.
Q: How do I report a bug?
A: Please open an issue on GitHub Issues with details and a minimal reproduction example.
Q: Can I contribute?
A: Absolutely! Contributions are welcome. Please read CONTRIBUTING.md first.
Made with โค๏ธ for the Nepali Tech Community
If this project helps you, please consider giving it a โญ!
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nepse_client-0.1.4.tar.gz.
File metadata
- Download URL: nepse_client-0.1.4.tar.gz
- Upload date:
- Size: 42.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba021f85b56b59f0fb66e9a7ff02a0fffdd97992bbe3d4a7555ff264412d9720
|
|
| MD5 |
64a527ff1e74152d954ed417a6697ce4
|
|
| BLAKE2b-256 |
b9c9fa0b84b17a742a8552899ead685356a79ed692e8bb2d9291562911adb8ba
|
Provenance
The following attestation bundles were made for nepse_client-0.1.4.tar.gz:
Publisher:
publish.yml on 4mritGiri/NepseClient
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nepse_client-0.1.4.tar.gz -
Subject digest:
ba021f85b56b59f0fb66e9a7ff02a0fffdd97992bbe3d4a7555ff264412d9720 - Sigstore transparency entry: 695978899
- Sigstore integration time:
-
Permalink:
4mritGiri/NepseClient@c84f037e544cee8e4a7d8f7c5add31539d5da54e -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/4mritGiri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c84f037e544cee8e4a7d8f7c5add31539d5da54e -
Trigger Event:
release
-
Statement type:
File details
Details for the file nepse_client-0.1.4-py3-none-any.whl.
File metadata
- Download URL: nepse_client-0.1.4-py3-none-any.whl
- Upload date:
- Size: 39.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d339d18cb67e96595bbea04bc09a0019cd28a6fa82b69725c1f72118c11d6cd0
|
|
| MD5 |
38bc3da45f17ab7712b6fdd3e2c9261c
|
|
| BLAKE2b-256 |
36c9593b871d9e083b09970a235372d7a998e4d33a58a50d6663efdbfcdfc101
|
Provenance
The following attestation bundles were made for nepse_client-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on 4mritGiri/NepseClient
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nepse_client-0.1.4-py3-none-any.whl -
Subject digest:
d339d18cb67e96595bbea04bc09a0019cd28a6fa82b69725c1f72118c11d6cd0 - Sigstore transparency entry: 695978910
- Sigstore integration time:
-
Permalink:
4mritGiri/NepseClient@c84f037e544cee8e4a7d8f7c5add31539d5da54e -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/4mritGiri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c84f037e544cee8e4a7d8f7c5add31539d5da54e -
Trigger Event:
release
-
Statement type: