Look Up MCA Company Directors for KYC Compliance (2026)
Extract Indian company directors with DIN and designation from MCA for KYC and UBO verification. Structured JSON via Thirdwatch MCA Scraper, no login needed.

Thirdwatch's MCA India Scraper returns director-level data for any Indian company by CIN -- full name, DIN (Director Identification Number), and designation. Built for KYC operations teams, compliance officers, and onboarding workflows that need to verify who controls an Indian entity before approving a vendor, customer, or counterparty. Pass a list of CINs, get structured director records back. Cross-reference DINs across companies to detect board interlocks and identify Ultimate Beneficial Owners for PMLA compliance.
Why look up MCA directors for KYC
Know Your Customer regulations in India require verification of the individuals who control a business entity. Under the Prevention of Money Laundering Act (PMLA) and RBI's KYC Master Direction, regulated entities must identify directors and beneficial owners of corporate customers. The MCA registry is the official source for this data.
According to SEBI's enforcement data, over 3,400 directors were disqualified under Section 164(2) of the Companies Act in the 2023-24 cycle alone for non-filing of annual returns. Onboarding a company whose directors are disqualified exposes your organization to regulatory risk. The standard KYC check requires extracting the current board composition, verifying each director's DIN against disqualification lists, and confirming designations match the authorized signatory claims.
Manual lookup on MCA21 is CAPTCHA-gated and returns one company at a time. For operations teams processing 20-100 entity verifications per week, the manual path creates a compliance bottleneck. The Thirdwatch MCA India actor returns structured director data by CIN, enabling automated KYC workflows that scale with your onboarding volume.
How does this compare to the alternatives?
| Approach | Reliability | Setup time | Maintenance | Director data |
|---|---|---|---|---|
| MCA21 portal (manual) | CAPTCHA-gated, one-at-a-time | Immediate (with subscription) | Per-lookup effort | Available but unstructured |
| Commercial KYC API (Signzy, Probe42) | High | Weeks (contract + compliance review) | Vendor-managed | Gated behind premium tiers |
| Thirdwatch MCA India Scraper | High | 5 minutes | Thirdwatch tracks MCA changes | Included by default, structured JSON |
The MCA India Scraper returns director data as a first-class output field -- no premium tier required.
How to extract MCA directors for KYC in 4 steps
Step 1: How do I authenticate and configure the actor?
Set up your Apify client. Sign in at apify.com and copy your API token from Settings, then Integrations:
pip install apify-client pandas
export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"Step 2: How do I extract directors for a batch of companies?
Pass CINs with includeDirectors set to True (the default):
from apify_client import ApifyClient
import pandas as pd
client = ApifyClient("apify_api_xxxxxxxxxxxxxxxx")
# Vendor onboarding batch -- CINs from your pending verification queue
vendor_cins = [
"L17110MH1973PLC019786", # Reliance Industries
"U72200KA2004PTC035289", # Infosys BPM
"L65910MH2000PLC129408", # ICICI Bank
"U74140DL2008PTC179845", # Example private company
]
run = client.actor("thirdwatch/mca-india-scraper").call(
run_input={
"queries": vendor_cins,
"maxResults": 50,
"includeDirectors": True,
}
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"Retrieved {len(items)} companies")
# Extract all directors into a flat table
director_records = []
for item in items:
for d in item.get("directors") or []:
director_records.append({
"cin": item["cin"],
"company_name": item.get("company_name", ""),
"company_status": item.get("status", ""),
"director_name": d.get("name", ""),
"din": d.get("din", ""),
"designation": d.get("designation", ""),
})
directors_df = pd.DataFrame(director_records)
print(f"Total directors across all companies: {len(directors_df)}")Four CINs, structured director data in under a minute. Each director record includes full name, DIN, and designation (e.g., Managing Director, Whole-time Director, Independent Director).
Step 3: How do I flag directors serving on multiple entities?
Cross-company director analysis surfaces related-party risks:
# Find directors with multiple board seats in your vendor portfolio
multi_seat = (
directors_df.groupby(["din", "director_name"])
.agg(
board_seats=("cin", "nunique"),
companies=("company_name", lambda x: list(x.unique())),
designations=("designation", lambda x: list(x.unique())),
)
.reset_index()
.query("board_seats > 1")
.sort_values("board_seats", ascending=False)
)
print(f"\n{len(multi_seat)} directors serve on multiple boards in your portfolio:")
for _, row in multi_seat.iterrows():
print(f" {row['director_name']} (DIN: {row['din']})")
print(f" Seats: {row['board_seats']} -- {', '.join(row['companies'])}")
print(f" Roles: {', '.join(row['designations'])}")A director serving as Managing Director on two vendor entities in your portfolio is a related-party signal that compliance teams need to flag during onboarding.
Step 4: How do I generate a KYC verification report?
Structure the output for compliance review and audit trail:
# Build a KYC-ready report per company
for item in items:
print(f"\n{'='*60}")
print(f"Company: {item.get('company_name', 'N/A')}")
print(f"CIN: {item['cin']}")
print(f"Status: {item.get('status', 'N/A')}")
print(f"Incorporation: {item.get('incorporation_date', 'N/A')}")
print(f"Registered Address: {item.get('registered_address', 'N/A')}")
print(f"RoC: {item.get('roc', 'N/A')}")
print(f"Authorized Capital: {item.get('authorized_capital', 'N/A')}")
print(f"Paid-up Capital: {item.get('paid_up_capital', 'N/A')}")
# Director KYC section
directors = item.get("directors") or []
print(f"\nDirectors ({len(directors)}):")
for d in directors:
print(f" - {d.get('name', 'N/A')} | DIN: {d.get('din', 'N/A')} | {d.get('designation', 'N/A')}")
# Flag non-active companies
if item.get("status") != "Active":
print(f"\n ** WARNING: Company status is {item.get('status')} -- escalate to compliance lead **")
# Export for audit trail
directors_df.to_csv("kyc_director_verification.csv", index=False)
print(f"\nExported {len(directors_df)} director records to kyc_director_verification.csv")The CSV export serves as an audit trail. Each record maps a director (by DIN) to a company (by CIN) with the designation verified against the MCA registry.
Step 5: How do I integrate this into an automated onboarding pipeline?
Wire the actor into your vendor onboarding workflow:
def verify_vendor_kyc(cin: str) -> dict:
"""Automated KYC check for a single vendor CIN."""
run = client.actor("thirdwatch/mca-india-scraper").call(
run_input={
"queries": [cin],
"maxResults": 1,
"includeDirectors": True,
}
)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
if not items:
return {"cin": cin, "status": "NOT_FOUND", "risk": "HIGH"}
company = items[0]
risk_flags = []
if company.get("status") != "Active":
risk_flags.append(f"Company status: {company.get('status')}")
if not company.get("directors"):
risk_flags.append("No directors found")
if not company.get("paid_up_capital"):
risk_flags.append("Paid-up capital missing")
return {
"cin": cin,
"company_name": company.get("company_name"),
"status": company.get("status"),
"director_count": len(company.get("directors", [])),
"risk_flags": risk_flags,
"risk_level": "HIGH" if risk_flags else "LOW",
}This function slots into any onboarding pipeline -- call it at vendor registration time, feed the result into your risk scoring model, and route flagged entities to manual review.
Sample output
Director-focused view of the actor output:
[
{
"cin": "L17110MH1973PLC019786",
"company_name": "Reliance Industries Limited",
"status": "Active",
"directors": [
{"name": "Mukesh Dhirubhai Ambani", "din": "00001695", "designation": "Managing Director"},
{"name": "Nikhil Rasesh Meswani", "din": "00001620", "designation": "Executive Director"},
{"name": "Hital Rasesh Meswani", "din": "00001623", "designation": "Executive Director"}
],
"query": "L17110MH1973PLC019786"
},
{
"cin": "U72200KA2004PTC035289",
"company_name": "Infosys BPM Limited",
"status": "Active",
"directors": [
{"name": "Anantha Radhakrishnan", "din": "07453711", "designation": "Director"},
{"name": "Sunil Kumar Dhareshwar", "din": "07596207", "designation": "Director"}
],
"query": "U72200KA2004PTC035289"
}
]Each director record carries three fields: name (full legal name as filed with MCA), din (8-digit Director Identification Number), and designation (Managing Director, Independent Director, Whole-time Director, etc.). DIN is the unique identifier that links a person across all their board positions in India.
Common pitfalls
Three issues surface in director-focused KYC workflows. Name matching ambiguity -- MCA records use the legal name as filed, which may differ from the name on PAN, passport, or Aadhaar. "Mukesh D. Ambani" vs "Mukesh Dhirubhai Ambani" will not match on exact string comparison. Use DIN as the canonical identifier, not the name string. DIN is unique and permanent.
Disqualified director lists are separate -- the actor returns current directors as published in the MCA registry. It does not cross-reference against the Section 164(2) disqualification list. You need a separate check against the MCA disqualified directors list using the DIN extracted from the actor output.
Designation vs authority -- "Director" is a broad designation. For KYC purposes, distinguish between Managing Director (executive authority), Independent Director (oversight only), and Nominee Director (represents a shareholder). The actor returns the designation exactly as filed with MCA, which maps to specific authority levels in the Companies Act 2013.
Thirdwatch handles the registry access so your compliance team can focus on the verification logic. Pair director data with GST Verification for tax compliance and IBBI Insolvency for bankruptcy screening.
Related use cases
- MCA India Scraper on Apify Store
- Scrape MCA India company data for due diligence -- full company master data for compliance packs
- Build an India company registry database from MCA -- bulk extraction for database builds
- Track India company incorporations by state -- geographic analysis of new registrations
- Lookup insolvency professionals on IBBI registry -- cross-reference directors against insolvency records
- The complete guide to scraping compliance data
- All Thirdwatch use-case guides
Frequently asked questions
Does the actor return DIN for every director?
Yes. Every director record includes the Director Identification Number (DIN), full name, and designation. DIN is a unique 8-digit identifier issued by MCA and is the canonical key for identifying individuals across Indian company boards. Use DIN to cross-reference directors across multiple companies.
Can I identify Ultimate Beneficial Owners from this data?
The actor returns current directors and key managerial personnel. For UBO identification, cross-reference directors serving on multiple related entities using DIN as the join key. Combine with shareholding data from annual returns for a complete UBO picture.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.