Purpose
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.
When to Use
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.
Workflow
- 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);
})()- 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 : 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.
Site-Specific Gotchas
- 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.
Expected Output
For NSE, return a date-filtered array shaped as {date: "YYYY-MM-DD", cells: [...], links: [{text, href}], text: "..."}. For BSE, return {date: "YYYY-MM-DD", record: {...}, links: [{text, href}], text: "..."} objects, chronologically ordered and deduplicated.