# MCA Company Financials API

The full multi-year financial statements filed with the MCA for an Indian company, looked up by CIN or by name: profit and loss, balance sheet and cash flow, standalone and consolidated, plus registered charges — every year on file, line item by line item, in rupees.

**Pricing:** $1 per company

**Endpoint:** `POST /v1/data/mca/company-financials/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. 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. |
| `maxResults` | integer | No | Stop after this many have been looked up. Each ROW costs, so this caps the bill as well as the output. With `names` it bounds the companies resolved, so you may get fewer rows than this if some have no financials on file. 0 or omitted means every identifier you sent — and for a NAME that means every company the name resolves to, up to 50. Set it when you send a name you have not narrowed. |
| `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. ONE NAME CAN MATCH SEVERAL COMPANIES and each match with statements on file 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-financials/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-financials/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 |
| `latestFy` | Latest FY | text |
| `yearsOfData` | Years Of Data | number |
| `netProfitInr` | Net Profit (INR) | number |
| `pLStandalone` | P&L Standalone | object |
| `pLConsolidated` | P&L Consolidated | object |
| `balanceSheetStandalone` | Balance Sheet Standalone | object |
| `balanceSheetConsolidated` | Balance Sheet Consolidated | object |
| `cashFlowStandalone` | Cash Flow Standalone | object |
| `cashFlowConsolidated` | Cash Flow Consolidated | object |
| `charges` | Charges | object |
