Skip to main content
Thirdwatchthirdwatch
Compliance & registries

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.

May 26, 2026 · 6 min read · 1,348 words
See the scraper →

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

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

Try it yourself

100 free credits, no credit card.

About 30 real searches. Add the MCP to Claude or Cursor in two minutes.