# MCA Company API

The public MCA record for an Indian company, looked up by CIN or by name: registration and status, authorised and paid-up capital, the registered address, the full board of directors, and the latest-year financial summary — revenue, EBITDA, net profit, net worth and borrowings. All amounts in rupees.

**Pricing:** $0.05 per company

**Endpoint:** `POST /v1/data/mca/company/run`

**Auth:** `Authorization: Bearer mk_live_...`

## Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `queries` | array | No | One or more 21-character Corporate Identity Numbers, e.g. L23201MH1952GOI008858. Each CIN returns one row; a CIN that is not in the register returns no row and is not charged. ONE BAD CIN DOES NOT SINK THE BATCH — anything that is not a valid CIN is skipped, the rest are looked up, and the run tells you which ones were skipped. Use `names` if you do not have the CIN. |
| `include` | array | No | Which optional blocks to fetch. Defaults to ["directors","financials"]; drop one to skip that lookup. |
| `maxResults` | integer | No | Stop after this many have been looked up. Each one costs a row, so this caps the bill as well as the output. 0 or omitted means every identifier you sent. |
| `names` | array | No | One or more company names, or parts of one. Matching is case-insensitive and tries an exact prefix first, then a substring, so "reliance industries" finds RELIANCE INDUSTRIES LIMITED. ONE NAME CAN MATCH SEVERAL COMPANIES and each match is a row, so use maxResults to bound a broad name. |

## Example

`?wait=true` holds the request open until the run finishes (up to 60s) and returns the rows inline — one request, no polling.

```bash
curl -X POST "https://api.mindcase.co/v1/data/mca/company/run?wait=true" \
  -H "Authorization: Bearer mk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"params":{}}'
```

```python
import requests

resp = requests.post(
    "https://api.mindcase.co/v1/data/mca/company/run",
    params={"wait": "true"},
    headers={"Authorization": "Bearer mk_live_YOUR_API_KEY"},
    json={"params": {}},
)
rows = resp.json()["data"]
```

## Longer runs

If the run is still going at the 60s ceiling you get back `{ job_id, status: "running" }` instead of rows (same if the result is over 100 rows — those come back `truncated`). Poll with that `job_id`:

```bash
# 1) check status
curl https://api.mindcase.co/v1/jobs/JOB_ID \
  -H "Authorization: Bearer mk_live_YOUR_API_KEY"

# 2) when status == completed, fetch the rows
curl https://api.mindcase.co/v1/jobs/JOB_ID/results \
  -H "Authorization: Bearer mk_live_YOUR_API_KEY"
```

Full API reference (auth, jobs, balance, SDKs, MCP): https://mindcase.co/skills.md

## Response columns

| Field | Display name | Type |
|-------|--------------|------|
| `cin` | CIN | text |
| `companyName` | Company Name | text |
| `entityType` | Entity Type | text |
| `listingStatus` | Listing Status | text |
| `incorporationDate` | Incorporation Date | text |
| `companyStatus` | Company Status | text |
| `authorisedCapitalInr` | Authorised Capital (INR) | number |
| `paidUpCapitalInr` | Paid-up Capital (INR) | number |
| `state` | State | text |
| `city` | City | text |
| `district` | District | text |
| `pincode` | Pincode | text |
| `registeredAddress` | Registered Address | text |
| `directorsCount` | Directors Count | number |
| `directors` | Directors | array |
| `hasFinancials` | Has Financials | boolean |
| `latestFy` | Latest FY | text |
| `yearsOfData` | Years Of Data | number |
| `hasConsolidated` | Has Consolidated | boolean |
| `revenueInr` | Revenue (INR) | number |
| `ebitdaInr` | EBITDA (INR) | number |
| `netProfitInr` | Net Profit (INR) | number |
| `netWorthInr` | Net Worth (INR) | number |
| `totalBorrowingsInr` | Total Borrowings (INR) | number |
