# Changelog of IndiaMART Supplier Data — GST, Legal Status, IEC & CIN (`foxlabs/indiamart-supplier-data`) Actor

- **URL**: https://apify.com/foxlabs/indiamart-supplier-data/changelog.md
- **Full Actor documentation**: https://apify.com/foxlabs/indiamart-supplier-data.md

## Changelog

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

- **Listings.** Supplier rows from IndiaMART category and city listing pages (`dir.indiamart.com/impcat/<slug>.html`, `dir.indiamart.com/<city>/<slug>.html`) — one row per IndiaMART account, deduplicated across listings. Cities are processed in turn (round-robin), so a `maxResults` cap samples every city.
- **Factsheet, cheapest reliable page first.** (1) the catalog site IndiaMART hosts on the supplier's own domain — factsheet on the homepage (`.eatT` blocks) or in its `profile.html` table, plus the footer GSTIN; (2) the storefront IndiaMART links in the listing; (3) a storefront guessed from IndiaMART's code, used only when the page belongs to the same account (glId check); (4) the product page. A supplier is settled as soon as its legal status is known — or, with proprietorships excluded, as soon as its GSTIN shows an individual's PAN — so no further page is fetched for it.
- **Fields (36 per supplier row).** Legal status, nature of business, GSTIN (format + check character validated), IEC, CIN, employee and turnover bands, GST registration year, year of establishment, years on IndiaMART, rating, rating count, response rate, up to 10 products, the listed website and whether IndiaMART hosts it. "-", "NA", "Not Available" and masked (`*`) values are treated as empty; personal fields on IndiaMART pages (CEO, GST partner names, banker) are never read into the row.
- **DPDP.** `includeProprietorships` (default off): proprietorships — by legal status, or by an individual's PAN in the GSTIN when the legal status is missing — are skipped; suppliers whose legal status cannot be confirmed are skipped unless the name ends in Limited / Pvt Ltd / LLP. A second IndiaMART account with the same GSTIN is dropped.
- **PNS phone.** IndiaMART's PNS virtual number is emitted as `indiamartPhone` (+ `indiamartPhoneExtension`), with `indiamartPhoneType: "pns-virtual"` and a one-line `indiamartPhoneNote`.
- **No website contacts.** Website contact enrichment was removed before release. In testing (3 categories × 2 cities, 168 supplier entries) all 89 supplier websites were IndiaMART-hosted catalogues with no email or phone of their own, so the `enrichWebsite` input, the `website-enrichment` event and the always-empty `websiteEmails` / `websitePhones` / `websiteEmailsText` / `websitePhonesText` / `contactSource` columns are gone.
- **Proxy and session rotation.** Default: Apify Proxy, Residential group (in testing IndiaMART accepted 10 of 12 residential sessions and refused 9 of 13 datacenter sessions). A run keeps one proxy session until IndiaMART refuses it: on HTTP 403 — or HTTP 429 after its back-off — the session is retired and the same page is retried from a fresh one, at most 3 sessions per page and 10 new sessions per run, with a 3 s pause before a retry after 403 and the shared pace kept. When every session is refused, the run ends with partial rows, `SOURCE_REPORT` and an uncharged summary row that names the proxy group actually used and how many sessions were tried, with advice that fits Residential, datacenter or no proxy. A 403 on robots.txt counts as a refusal — nothing on that host is requested — not as "no robots.txt".
- **Politeness.** robots.txt read for dir/www and for every supplier domain; redirects on IndiaMART followed by hand with a robots check at each hop; the `search.mp` endpoint is never requested; one pacing gate (≥ `requestDelayMs`, min 1000 ms) for every IndiaMART-operated host; concurrency ≤ 2; HTTP/1.1 only.
- **Rate limits.** On HTTP 429 all IndiaMART requests pause (Retry-After, else 20 s); after 2 pauses in a page type, or 90 s of pauses in the run, that page type is switched off and the run finishes with the remaining pages. Rows that stay incomplete get `factsheetStatus: "rate-limited"`.
- **Reporting.** `SOURCE_REPORT` in the key-value store — per-listing status, where each legal status came from, website types, 429 pauses, proxy sessions (used, new after 403 / 429, pages refused on every session), requests and compressed bytes per page type — checkpointed every 10 suppliers and saved on abort. A `rowType: "summary"` row explains an empty run, a failed listing (404, 403 refusal, robots, redirect) or rows affected by refusals or rate limiting.
- **Billing.** Pay-per-event `supplier-record` per supplier row; compute and proxy traffic (the Residential proxy included) are part of that price. The summary row is never charged.
