DEV Community

Factden
Factden

Posted on

How to Scrape India MCA Company and Director Contacts in 2026 (Python + a No-Code Shortcut)

If you sell into India, the contact that actually moves a deal is a decision maker, a company's director, not a generic info@ inbox. India's Ministry of Corporate Affairs (MCA) registry is where that lives: every registered company, its status, capital and filings, the full board, and on each director's DIN their personal email and phone. Getting it out cleanly, and matching a director to every company they sit on, is the hard part.

This guide shows both ways: a runnable Python recipe, and a no-code shortcut with the MCA India Company and Director Data Scraper that skips the hard parts entirely. Run it by industry and state to build a whole segment of B2B leads at once, then enrich the board with director contacts.

What you can pull

  • Company master for a CIN: legal name, status, company type and class, incorporation date, industry (NIC), state, authorised and paid-up capital, ROC, registered addresses, board size, and three years of filing history.
  • The full board for a company: every director with DIN, name, designation, and dates.
  • Director master for a DIN: status, date of birth, gender, nationality, and the full directorship network, every company they sit on with designation and dates.
  • Director contacts as an opt-in enrichment: the director's personal email and phone as registered with MCA on their DIN or DIR-3 KYC record.
  • Discovery by industry and state: pick a sector and a state and pull a whole segment of companies at once, not one CIN at a time.

Why scraping MCA directly is hard

The MCA portal does not hand you company and director records in simple HTML you can select with CSS. Most lookups sit behind a session and token flow, and the pieces you want, company master, the board, each director's master record, and the directorship graph, come from different calls that you then have to stitch into one clean row. Discovery is its own problem: finding every active company in an industry and state means understanding how a CIN prefix encodes industry and paginating the full result set. You can solve all of this, but it is real engineering, and it breaks whenever the registry reshapes a response.

That is the whole reason a maintained actor exists: it absorbs the token and lookup work and hands you a flat table.

DIY vs actor vs official data

Write it yourself MCA scraper (actor) Official MCA portal
Setup Token flow, lookups, response parsing Paste a CIN, DIN, name, or pick industry and state Manual per-company lookups
Company plus board plus directorship graph You stitch several calls Included, one clean row One company at a time
Discovery by industry and state You decode CIN prefixes Included Not offered as a bulk export
Director email and phone Separate KYC lookup to solve Opt-in enrichment Not exposed in bulk
Cost model Free but you build it Free tier, then pay per result Per-document fees, manual
Access You own every breakage Maintained for you Their portal, no bulk export

There is no open MCA bulk API that hands you company and director records for a whole segment. The portal is built for one-company-at-a-time lookups. For open collection into your own pipeline, the choice is really "build and maintain it" or "call an actor and pay per run".

The no-code way (about a minute)

  1. Create a free Apify account and open the actor page.
  2. Click Try for free. The input is pre-filled with an example.
  3. Pick a mode (Companies or Directors), then give it a CIN, DIN, name, or an industry and state, and click Start.
  4. Download the results from the Output tab as JSON, CSV, or Excel.

To refresh a segment on a schedule, save your input as a Task and attach a Schedule. Each run appends a fresh snapshot, so a lead list stays current as new companies register.

Run it from Python

The actor runs on Apify, so you drive it with the Apify client. Install it with pip install apify-client, grab your token from Apify Settings, then:

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

# Discover a whole segment: active IT companies in Maharashtra, with their boards.
run_input = {
    "mode": "company",
    "industries": ["Information and communication"],
    "states": ["Maharashtra"],
    "companyStatuses": ["Active"],
    "includeDirectors": True,
    "maxCompanies": 200,
}

run = client.actor("factden/mca-company-director-scraper").call(run_input=run_input)

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
Enter fullscreen mode Exit fullscreen mode

To pull directors by name and enrich them with personal contacts instead, switch the mode and turn on the enrichment:

run_input = {
    "mode": "director",
    "directorNames": ["Nandan Nilekani"],
    "directorLeads": True,   # opt-in email + phone enrichment
    "includeCompanies": True,
    "maxDirectors": 25,
}
Enter fullscreen mode Exit fullscreen mode

mode selects the run: company drives discovery by CIN, company name, or industry and state; director drives lookups by DIN or director name. Only the inputs the selected mode needs are used. directorLeads is the opt-in switch for personal email and phone.

What the output looks like

Trimmed from a real director run for a single director (contacts shown as dummy values here):

{
  "din": "02790976",
  "name": "NANDAN M. NILEKANI",
  "status": "Approved",
  "gender": "Male",
  "nationality": "Indian",
  "email": "nandan.nilekani@example.com",
  "phone": "+919876543210",
  "directorshipsCount": 5,
  "company": "INFOSYS LIMITED",
  "cin": "L85110KA1981PLC013115",
  "designation": "Director"
}
Enter fullscreen mode Exit fullscreen mode

The fields you get depend on the mode you run:

Mode What each row carries
company One row per company: CIN, name, status, type, capital, industry, state, ROC, addresses, filings, board size
company + includeDirectors The company plus its board, one director per row with designation and dates
director One row per directorship: DIN, name, status, DOB, gender, and the company with designation and dates
director + directorLeads The same, plus the director's personal email and phone (charged once per unique DIN, only when found)

Field names are documented on the listing and in the repo below rather than invented here, so what you build against matches what the actor emits.

Try it on a real dataset first

If you want to see the shape before running anything, there is a free sample MCA director dataset you can open in the browser, and the input, snippets, and field reference are on GitHub.

FAQ

Do I need an MCA login or API key?
No. There is no MCA portal login, no account, and no API key. You only need an Apify token to run the actor.

Can I search by company name, director name, or industry?
Yes. By exact CIN or DIN, by company or director name (a prefix match on the registered name), or by industry mapped to the NIC code, narrowed by state, status, type, and listing.

How are director contacts charged?
Once per unique director (DIN) and only when a real email or phone is found, never per row. A director who sits on five boards is billed once.

How do I keep a lead list current?
Save your input as a Task and attach a Schedule. Each run appends a fresh snapshot, so new registrations in your target segment show up over time.

Is it legal?
Company and director master data is public-record. The director email and phone enrichment returns personal data protected under India's DPDP Act, 2023, so you must have a lawful basis to obtain and process it. Use the output responsibly.

Related

Building B2B lead and market data across sources? The same team maintains a G2 reviews scraper for software buyer intelligence and an Indeed jobs scraper for hiring and labor-market signals, so you can line up firmographics, buyer sentiment, and hiring in the same format.

Full write-up with more examples: how to scrape MCA company and director data, and the MCA data hub has the field reference and use cases.

Top comments (0)