Retrieve read-only corporate filing announcements for a listed equity over a requested date range, including filing text, table or API fields, and attachment links.
Use Cases
Use for requests to research, list, or review NSE India corporate filings or announcements for a specified equity symbol and date range. For BSE-specific requests, use the optional BSE API route when a BSE scrip code is available.
Automation Flow
- For NSE equity announcements, construct the direct filings URL, URL-encoding the symbol:
https://www.nseindia.com/companies-listing/corporate-filings-announcements?symbol={symbol}&tabIndex=equity. - Navigate directly to that URL, preferably waiting for network idle so the client-rendered filings table is populated.
- Run this page-local extractor after substituting
{start-date}and{end-date}with inclusive ISO dates (YYYY-MM-DD):
(() => {
const start = "{start-date}";
const end = "{end-date}";
const month = {jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};
const iso = (y,m,d) => `${String(y).padStart(4,"0")}-${String(m).padStart(2,"0")}-${String(d).padStart(2,"0")}`;
const parseDate = value => {
const s = String(value ?? "").replace(/\s+/g," ").trim();
let m = s.match(/(\d{4})[-\/]([01]?\d)[-\/]([0-3]?\d)/);
if (m) return iso(+m[1], +m[2], +m[3]);
m = s.match(/([0-3]?\d)[-\/\s]([A-Za-z]{3,9})[-\/\s](\d{4})/);
if (m && month[m[2].slice(0,3).toLowerCase()]) return iso(+m[3], month[m[2].slice(0,3).toLowerCase()], +m[1]);
m = s.match(/([0-3]?\d)[-\/]([01]?\d)[-\/](\d{4})/);
return m ? iso(+m[3], +m[2], +m[1]) : null;
};
const rows = [...document.querySelectorAll("table tbody tr, [role='row']")];
const seen = new Set();
return rows.map(row => {
const cells = [...row.querySelectorAll(":scope > th, :scope > td, :scope > [role='cell']")].map(cell => cell.innerText.replace(/\s+/g," ").trim());
if (!cells.length) return null;
const dateIndex = cells.findIndex(parseDate);
const date = dateIndex < 0 ? null : parseDate(cells[dateIndex]);
if (!date || date < start || date > end) return null;
const links = [...row.querySelectorAll("a[href]")].map(a => ({text:a.innerText.replace(/\s+/g," ").trim(), href:new URL(a.getAttribute("href"), location.href).href}));
const key = date + "|" + cells.join("|") + "|" + links.map(x => x.href).join("|");
if (seen.has(key)) return null;
seen.add(key);
return {date, cells, links, text: row.innerText.replace(/\s+/g," ").trim()};
}).filter(Boolean).sort((a, b) => a.date.localeCompare(b.date));
})()- Report the returned rows in chronological order, preserving each row's
cells, announcement text, and attachment URLs. The date interval is inclusive.
Optional BSE direct API route
For a BSE request, use the observed JSON endpoint directly rather than navigating the BSE homepage:
https://api.bseindia.com/BseIndiaAPI/api/AnnSubCategoryGetData/w?pageno={page}&strCat=-1&strPrevDate={start-date-DDMMYYYY}&strScrip={bse-scrip-code}&strSearch=P&strToDate={end-date-DDMMYYYY}&strType=C&subcategory=-1
Navigate to page 1, then run the following extractor on the loaded JSON response. If the response is paginated and page 1 indicates more results, repeat with incremented {page} values and concatenate, deduplicating by announcement identifier or record contents.
(() => {
const start = "{start-date}";
const end = "{end-date}";
const month = {jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};
const iso = (y,m,d) => `${String(y).padStart(4,"0")}-${String(m).padStart(2,"0")}-${String(d).padStart(2,"0")}`;
const parseDate = value => {
const s = String(value ?? "").replace(/\s+/g," ").trim();
let m = s.match(/(\d{4})[-\/]([01]?\d)[-\/]([0-3]?\d)/);
if (m) return iso(+m[1],+m[2],+m[3]);
m = s.match(/([0-3]?\d)[-\/\s]([A-Za-z]{3,9})[-\/\s](\d{4})/);
if (m && month[m[2].slice(0,3).toLowerCase()]) return iso(+m[3],month[m[2].slice(0,3).toLowerCase()],+m[1]);
m = s.match(/([0-3]?\d)[-\/]([01]?\d)[-\/](\d{4})/);
return m ? iso(+m[3],+m[2],+m[1]) : null;
};
let payload;
try { payload = JSON.parse(document.body?.innerText || "null"); } catch { return []; }
const records = Array.isArray(payload) ? payload : (payload?.Table || payload?.table || payload?.data || payload?.Data || []);
const dateKeys = ["NEWS_DT","NEWS_DATE","NEWS_DT1","DATE","Date","date","ANNOUNCEMENT_DATE"];
const attachmentKeys = ["ATTACHMENTNAME","ATTACHMENT","ATTACHMENT_NAME","PDF_LINK","ATTACHMENT_URL"];
const seen = new Set();
return (Array.isArray(records) ? records : []).map(record => {
const date = dateKeys.map(k => parseDate(record?.[k])).find(Boolean) || Object.values(record || {}).map(parseDate).find(Boolean);
if (!date || date < start || date > end) return null;
const links = attachmentKeys.map(k => record?.[k]).filter(v => typeof v === "string" && v.trim()).map(v => ({text:v, href:/^https?:\/\//i.test(v) ? v : null, attachment:v}));
const text = Object.values(record || {}).filter(v => v != null).join(" ").replace(/\s+/g," ").trim();
const key = String(record?.NEWSID || record?.NEWS_ID || record?.ANN_ID || date + "|" + text);
if (seen.has(key)) return null;
seen.add(key);
return {date, record, links, text};
}).filter(Boolean).sort((a,b) => a.date.localeCompare(b.date));
})()If the caller supplies only a company name for BSE, resolve the company's BSE scrip code through an official BSE search/quote result first; never guess the opaque numeric code.
Possible Friction Points
- The NSE equity filings view requires both
symbol={symbol}andtabIndex=equity; omitting the tab parameter can open a different filings view. - NSE filing data is rendered in table rows after page load; extract only after the filings table has populated.
- Do not guess an issuer-specific opaque identifier: NSE accepts the equity symbol directly, whereas the BSE API requires the numeric
strScripcode. - NSE dates may use localized separators or abbreviated month names; the extractor normalizes common ISO, numeric, and
DD-MMM-YYYYforms. - The BSE endpoint uses compact
DDMMYYYYdate parameters,strSearch=P,strType=C, and category values-1for the general corporate-announcement collection. - BSE attachment values may be filenames rather than absolute URLs; preserve them exactly unless the API supplies a complete URL.
- BSE results may be paginated through
pageno; stitch pages when the requested interval exceeds the first page.