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)
- Create a free Apify account and open the actor page.
- Click Try for free. The input is pre-filled with an example.
- Pick a mode (Companies or Directors), then give it a CIN, DIN, name, or an industry and state, and click Start.
- 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)
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,
}
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"
}
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)