NSE India Company Announcements Scraper ๐ฎ๐ณ
NSE India Company Announcements Scraper is a NexGenData tool that returns corporate announcements with PDF attachment links from the National Stock Exchange of India.
Live corporate announcements and regulatory filings from India's National Stock Exchange (NSE) โ dividends, quarterly results, board meetings, allotments, credit-rating updates, and more โ each with the original attachment (PDF) URL and a stable record id. Built for analysts, fintech products, and AI agents that need structured Indian-market disclosures without scraping a JavaScript site.
Not investment advice. Public disclosure data, provided as-is for information purposes.
๐ Sample Output
announcement_id | symbol | company_name | isin | industry | announcement_date |
|---|
| 106792186 | RELIANCE | Reliance Industries Limited | INE002A01018 | Refineries | 2026-09-24 |
| 106789883 | RELIANCE | Reliance Industries Limited | INE002A01018 | Refineries | 2026-09-23 |
| 106786607 | RELIANCE | Reliance Industries Limited | INE002A01018 | Refineries | 2026-09-21 |
| 106786596 | RELIANCE | Reliance Industries Limited | INE002A01018 | Refineries | 2026-09-21 |
| 106783625 | RELIANCE | Reliance Industries Limited | INE002A01018 | Refineries | 2026-09-17 |
| 106783619 | RELIANCE | Reliance Industries Limited | INE002A01018 | Refineries | 2026-09-17 |
Real rows from a real run (2026-09-24), unedited apart from masked emails/phones and shortened long text; fields the source does not publish are empty.
๐ง Input reference
| Field | Type | Default | What it does |
|---|
symbols | array | ["RELIANCE", "TCS"] | Filter to specific NSE ticker symbols (e.g. RELIANCE, TCS, INFY). Leave empty for the full market-wide announcement feed. |
category | string | | Case-insensitive substring matched against the announcement subject + headline (e.g. 'dividend', 'board meeting', 'results'). |
index | string (equities, sme, debt, mf, invitsreits) | "equities" | NSE announcement segment. |
maxResults | integer | 50 | Maximum announcement records to return (1-500). |
watchMode | boolean | false | When on, the first run seeds a baseline and emits nothing; later runs emit only NEW filings since the last run (composite key: symbol + date + subject-hash). Ideal on a schedule. |
watchLabel | string | "default" | Names the watch baseline so multiple saved tasks keep independent state. |
๐งพ JSON sample record
One real record from a real run (emails/phones masked, long text shortened):
{
"announcement_id": "106792186",
"symbol": "RELIANCE",
"company_name": "Reliance Industries Limited",
"isin": "INE002A01018",
"industry": "Refineries",
"announcement_date": "2026-09-24",
"announcement_time": "19:24 IST",
"subject": "Updates",
"headline": "This is further to the disclosure dated September 21, 2026 made by the Company. We wish to inform you that the Company executives participated in the Institutional Investors' Meeting - BofA Asia Pacific Conference 2026 and no unpublished price sensitive information was shared/discussed in the said one-on-one meeting.",
"has_xbrl": true,
"attachment_size": "233.32 KB",
"attachment_url": "https://nsearchives.nseindia.com/corporate/kavinavora_24092026192411_SE_24092026.pdf",
"source_url": "https://www.nseindia.com/companies-listing/corporate-filings-announcements",
"exchange": "NSE",
"scraped_at": "2026-09-24T23:56:30Z"
}
๐ What you get
One record per announcement, with these fields:
announcement_id โ stable NSE sequence id (dedup key)
symbol โ NSE ticker (e.g. RELIANCE)
company_name, isin, industry
announcement_date, announcement_time (IST)
subject โ the NSE category (e.g. "Board Meeting", "Financial Results", "Dividend")
headline โ the filing's descriptive text
has_xbrl โ whether a structured XBRL filing is attached
attachment_size, attachment_url โ the original PDF on nsearchives.nseindia.com
source_url, exchange, scraped_at
โฐ Watch mode โ new-filing alerts
Turn on watchMode and put the actor on a schedule. The first run seeds a baseline and emits nothing; every later run emits only new filings since the last run (keyed on symbol + date + subject-hash). Perfect for a standing "new NSE filings for my watchlist" feed into Slack, a sheet, or an agent.
{ "symbols": ["RELIANCE", "TCS", "INFY"], "watchMode": true, "watchLabel": "my-watchlist" }
๐ค Use with AI agents
The API section below shows how to call it from code.
Run it on a schedule
NSE companies post announcements all through the trading day, so an hourly or daily run suits most watchlists. Each run picks up newly published filings; earlier announcements keep the same announcement_id and do not change. Turn on watchMode and the first run saves a baseline and returns nothing, then every later run returns only filings that are new since the last run. Give each saved task its own watchLabel so their baselines stay separate. Send each run's results onward with a webhook, Google Sheets, Zapier, Make or the Bytewells API.
FAQ
Why use this instead of the official NSE website?
NSE publishes these announcements for free on its Corporate Filings page, which is a JavaScript site made for reading one page at a time. This actor returns the same announcements as clean JSON, with the original PDF link and a stable record id on every row. It can also run on a schedule and return only new filings. It is not affiliated with or endorsed by NSE or SEBI.
What does a typical run cost?
One flat monthly price, with a free trial; there is no per-row charge. Bytewells bills compute separately from your prepaid credit, by memory and run time.
How do I get NSE dividend announcements as JSON?
Set category to "dividend". It is a case-insensitive text match on each filing's subject and headline, so "board meeting" or "results" work the same way. Add ticker symbols to symbols to limit it to your companies, or leave symbols empty for the whole market.
Does it cover BSE announcements too?
No. It reads NSE's corporate-announcements feed only, and every record carries "exchange": "NSE". Within NSE you can choose the equities, SME, debt, mutual fund or InvIT/REIT segment with the index input.
Does it extract the text inside the filing PDFs?
No. Each row gives the filing's headline text, the PDF's link and its size, and a flag for whether an XBRL filing is attached. You open or parse the PDF yourself from attachment_url.
How many announcements can one run return?
Between 1 and 500, set with maxResults. If NSE cannot be reached, the run fails instead of finishing as an empty success.
How it is billed on Bytewells
One flat monthly price for this actor, with a free trial to start. There is no charge per row, per result or per run from us.
Compute is billed separately by Bytewells from your prepaid credit, by memory and run time (per second). If a run uses the platform's proxy, Bytewells adds that traffic to the same run's compute bill.
Run it from the API
Bytewells speaks the same API as Apify, so curl or apify-client work with the Bytewells address and your Bytewells API key.
curl -X POST "https://bytewells.com/api/v2/acts/nexgendata~nse-bse-announcements/runs" \
-H "Authorization: Bearer YOUR_BYTEWELLS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"symbols": ["RELIANCE", "TCS"], "maxResults": 50}'
# when the run has finished, read its rows:
curl -H "Authorization: Bearer YOUR_BYTEWELLS_API_KEY" \
"https://bytewells.com/api/v2/actor-runs/RUN_ID/dataset/items"
from apify_client import ApifyClient
client = ApifyClient("YOUR_BYTEWELLS_API_KEY", api_url="https://bytewells.com/api")
run = client.actor("nexgendata/nse-bse-announcements").call(run_input={'symbols': ['RELIANCE', 'TCS'], 'maxResults': 50})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)
Contact
Questions, a source that changed, or a field you need: [email protected]