# Changelog of India NSE Filings — Announcements, Results & Corporate Actions (`foxlabs/india-listed-company-filings`) Actor

- **URL**: https://apify.com/foxlabs/india-listed-company-filings/changelog.md
- **Full Actor documentation**: https://apify.com/foxlabs/india-listed-company-filings.md

## Changelog

### 0.1.6 — 2026-10-08 — README: the Python example works with the current Apify client

- The README's Python example read the results with `run['defaultDatasetId']`. With the current Apify client for Python (version 3) `call()` returns a run object, not a dict, and that line raised `TypeError: 'Run' object is not subscriptable` — after the run itself had finished. The example now reads `run.default_dataset_id`; with client version 1 or 2, keep `run['defaultDatasetId']`. Checked with apify-client 3.2.1, 2.5.1 and 1.12.2.
- No code, output field or pricing change.

### 0.1.5 — 2026-09-28

- The input form starts at 20 announcements (`maxResults` prefill, was 200). A first run from the form now delivers 20 rows (measured: 9 s, 20 `filing-record` events) instead of 200, so it costs about $0.08 instead of $0.80. An API call without `maxResults` still gets 500.
- Output field descriptions: `filingId` and `filingSource` belong to financial results only (announcements, corporate actions and equity-list companies leave them empty); both used to carry the same merged text.

### 0.1 — 2026-09-10 — initial release

- Four modes on NSE India's public JSON endpoints and official archive files: `announcements` (corporate disclosures with the filed PDF/ZIP), `financial_results` (quarterly results from SEBI's integrated-filing feed for the March-2025 quarter onwards and NSE's legacy results feed for older quarters, with optional XBRL key figures), `corporate_actions` (dividends, splits, bonus, rights, buybacks, InvIT/REIT distributions) and `equity_list` (NSE's official `EQUITY_L.csv` — 2,568 companies on 2026-09-10).
- XBRL key figures as four-field INR money sets: revenue (`RevenueFromOperations`, or `InterestEarned` for banks), total income, total expenses, profit before tax, tax, net profit, paid-up capital, and total assets/equity on filings that carry a balance sheet; EPS basic/diluted. Tags a filing does not carry stay `null`.
- `isin` comes from NSE's official equity list (the current ISIN) whenever the symbol is on it — NSE's filing feeds still carry a pre-split ISIN for about one company in five. Other ISINs are checked (ISO 6166 check digit; NSE's all-zero placeholder is dropped). Every row says where its ISIN came from in `isinSource`: `equity_list`, `feed` (the filing feed's own value, possibly pre-split) or `null` when no ISIN is known.
- NSE's equity list has its own retry budget: up to three attempts on HTTP 401/403/429/5xx or a network error, after a 2 s and then a 4 s pause, each over a fresh proxy session. If it still fails, the run continues on the filing feeds, which live on another host: ISINs are marked `isinSource: "feed"`, `nseUrl` stays empty, the given symbols are used without validation, and one uncharged `source_report` row with status `degraded` plus a matching status message explains it. In `equity_list` mode a failed list still ends the run as `blocked`.
- Symbols are validated against the equity list before any request; an unknown symbol produces an error row with a "Did you mean …" suggestion when the name matches a listed company.
- Invalid input (custom range without `dateFrom`, an unreadable date, `dateFrom` after `dateTo`) ends the run with a `source_report` row (`status: "invalid_input"`) and a plain-language status message. Empty, suspicious-empty and blocked runs also write a `source_report` row.
- Clean values: text-only announcements get `attachmentSizeBytes: null` instead of 0; HTML entities in announcement texts are decoded (`&#8377;` → `₹`); quarter labels use one spelling ("Third quarter"); a regular plus a special dividend in one corporate action is reported as their total `amountPerShare`; `nseUrl` is only built for symbols on the official equity list.
- Access: plain HTTPS GET on cookie-less endpoints — no HTML scraping, no cookie handshake, no browser fingerprinting; at least 700 ms between requests and at most two archive downloads in flight. Default proxy is the automatic Apify Proxy (in a 2026-09-10 test the automatic pool was accepted 10/10 times, residential IPs 5/10). For the filing feeds, one HTTP 403 per run is retried over a fresh proxy session; a second one ends the run with a `blocked` report — rows collected before it (earlier date windows, or result rows when an XBRL download is refused) are still delivered.
- Billing: one `filing-record` event per delivered data row; error rows and `source_report` rows do not fire it.
