Research NSE Corporate Filings by Date

Site nseindia.comTask research-corporate-filingsVersion v2Updated Aug 21, 2026Category finance

Retrieve and date-filter a company's corporate filing announcements from NSE India, with an optional direct BSE announcements API route. This skill was captured from a live agent session on nseindia.com and publishes here verbatim, exactly as an agent receives it.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

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

  1. 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.
  2. Navigate directly to that URL, preferably waiting for network idle so the client-rendered filings table is populated.
  3. 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);
})()
  1. 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} and tabIndex=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 strScrip code.
  • NSE dates may use localized separators or abbreviated month names; the extractor normalizes common ISO, numeric, and DD-MMM-YYYY forms.
  • The BSE endpoint uses compact DDMMYYYY date parameters, strSearch=P, strType=C, and category values -1 for 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.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=nseindia.com&task=research-corporate-filings