API & MCP documentation
Base URL https://indianfirmdata.com (local: http://localhost:6350). Authenticate with Authorization: Bearer <key>. Create keys in the dashboard.
Every response is { data, meta: { request_id, credits_charged, balance } }. Add ?dry_run=true to any call to see its credit cost without paying. Errors return { error: { code, message } } and are never charged.
Endpoints
| Method | Path | What | Credits |
|---|---|---|---|
GET | /api/v1/filters | Filter catalogue (fields, types, operators) | free |
POST | /api/v1/companies/search | Structured search | 0.01/result |
POST | /api/v1/companies/nl-search | Natural-language search | 0.5 + 0.01/result |
GET | /api/v1/companies/enrich?domain=|name=|cin=|lei=|isin=|nse= | Resolve + full profile | 1 (0 on no match) |
GET | /api/v1/companies/{id}?include=people | Profile by id | 1 (+0.5/person) |
GET | /api/v1/companies/{id}/people | Officers / founders | 0.5/person |
GET | /api/v1/companies/{id}/jobs?live=1 | Jobs + hiring signals | 0.01/job (+1 live) |
GET | /api/v1/companies/{id}/news?live=1 | News + funding events | 0.1/item |
GET | /api/v1/companies/{id}/techstack?live=1 | Tech stack | 1 |
GET | /api/v1/companies/{id}/tenders | Central-govt tenders published as buyer (CPPP), coming soon: returns an empty list today | 0.01/tender |
GET | /api/v1/identifiers/decode?value= | Validate + decode CIN / GSTIN / PAN / Udyam / LEI / ISIN | 0 |
GET | /api/v1/identifiers/gst-status?gstin= | Live GST status via licensed GSP (not live yet: 501) | 0 + GSP fee at cost |
POST/GET | /api/v1/watchers | Create / list watchers | 0.25/new match, 2/change |
DELETE | /api/v1/watchers/{id} | Delete watcher | free |
POST | /api/v1/datasets/export | Bulk export (json/csv) | 0.005/row |
GET | /api/v1/usage | Balance + usage | free |
POST | /api/mcp | MCP (Streamable HTTP, JSON-RPC) | per tool |
Quick start
# Enrich by CIN, domain or name
curl "$BASE/api/v1/companies/enrich?domain=infosys.com" -H "Authorization: Bearer $KEY"
# Structured search (shorthand or [{field, op, value}])
curl -X POST "$BASE/api/v1/companies/search" -H "Authorization: Bearer $KEY" -H "content-type: application/json" \
-d '{"filters": {"state": "Karnataka", "listing_status": "listed", "employee_count": {"gte": 1000}}, "sort": "employees", "limit": 20}'
# Natural language
curl -X POST "$BASE/api/v1/companies/nl-search" -H "Authorization: Bearer $KEY" -H "content-type: application/json" \
-d '{"query": "Pune SaaS firms hiring AEM devs"}'
# Watch for changes (webhook signed with HMAC-SHA256)
curl -X POST "$BASE/api/v1/watchers" -H "Authorization: Bearer $KEY" -H "content-type: application/json" \
-d '{"kind": "company", "company_ids": ["co_..."], "fields": ["entity_status","address"], "webhook_url": "https://example.com/hook"}'MCP server (16 tools)
Remote (HTTP): add https://indianfirmdata.com/api/mcp with header Authorization: Bearer <key> to any MCP client that supports Streamable HTTP.
Local (stdio) for Claude Desktop / Claude Code:
{
"mcpServers": {
"indianfirmdata": {
"command": "npx",
"args": ["tsx", "D:/projects/surge-products/company-data/mcp/stdio.ts"],
"env": { "IFD_API_URL": "https://indianfirmdata.com", "IFD_API_KEY": "scd_..." }
}
}
}| Tool | Description |
|---|---|
list_filters | List every company search filter field with its type and allowed operators. Free. |
search_companies | Search Indian companies with structured filters (state, city, sector, listing_status, employee_count, hiring_roles, tech, cin, lei ...). 0.01 credits per result returned. |
natural_language_search | Search companies with a plain-English request, e.g. 'Pune SaaS firms hiring AEM devs'. Returns the parsed filters too. 0.5 credits + 0.01 per result. |
enrich_company | Find one company by domain, name, CIN, LEI, ISIN, NSE symbol or Wikidata id and return its full profile with sources, confidence and per-field freshness. 1 credit on match, 0 on no match. |
get_company | Full profile of a company by company id (co_...). 1 credit. |
get_company_people | Officers / founders / CEO of a company from public business sources (no personal contact data). 0.5 credits per person. |
get_company_jobs | Job posts and hiring signals. live=true checks public ATS boards now (+1 credit). 0.01 credits per job. |
get_company_news | Recent news and funding events. live=true refreshes from GDELT now. 0.1 credits per news item. |
get_company_tech | Technologies detected on the company website. live=true rescans the home page now (1 credit). |
get_company_tenders | Coming soon: central-government tenders the organisation published as buyer on CPPP. Returns an empty list until tender data access is in place. 0.01 credits per tender. |
decode_identifier | Validate and decode an Indian or global business identifier offline: CIN, GSTIN (state, PAN, checksum), PAN, Udyam, LEI, ISIN. Returns the matching company if known. Free. |
export_dataset | Export every company matching a search as JSON or CSV (max 50,000 rows). 0.005 credits per row. |
create_watcher | Watch companies for field changes (kind=company, company_ids) or a saved search for new matches (kind=search, filters). Optional webhook_url. |
list_watchers | List watchers and recent change events. Free. |
delete_watcher | Delete a watcher by id. Free. |
get_usage | Credit balance and usage for the last 30 days. Free. |
Webhook verification
const expected = hmacSha256Hex(secret, `${req.headers["x-surge-timestamp"]}.${rawBody}`);
const ok = req.headers["x-surge-signature"] === "v1=" + expected;Filters: 84 fields, 433 field-operator filters
identity
id | Company id | text: eq, neq, in, contains, starts_with, exists |
name | Display name | text: eq, neq, in, contains, starts_with, exists |
legal_name | Registered legal name | text: eq, neq, in, contains, starts_with, exists |
any_name | Name or alias | text: eq, neq, in, contains, starts_with, exists |
domain | Website domain | text: eq, neq, in, contains, starts_with, exists |
website | Website URL | text: eq, neq, in, contains, starts_with, exists |
cin | CIN (MCA) | text: eq, neq, in, contains, starts_with, exists |
lei | LEI (GLEIF) | text: eq, neq, in, contains, starts_with, exists |
isin | ISIN | text: eq, neq, in, contains, starts_with, exists |
nse_symbol | NSE symbol | text: eq, neq, in, contains, starts_with, exists |
wikidata_id | Wikidata QID | text: eq, neq, in, contains, starts_with, exists |
gstin | GSTIN | text: eq, neq, in, contains, starts_with, exists |
udyam_number | Udyam registration no. | text: eq, neq, in, contains, starts_with, exists |
description | Description text | text: eq, neq, in, contains, starts_with, exists |
location
country | Country (ISO-2) | text: eq, neq, in, contains, starts_with, exists |
state | State / UT | text: eq, neq, in, contains, starts_with, exists |
city | City | text: eq, neq, in, contains, starts_with, exists |
pincode | PIN code | text: eq, neq, in, contains, starts_with, exists |
address | Registered address text | text: eq, neq, in, contains, starts_with, exists |
region | Region (north/south/east/west) | text: eq, neq, in, contains, starts_with, exists |
is_metro | In a metro city | bool: eq |
hq_country | HQ country (GLEIF) | text: eq, neq, in, contains, starts_with, exists |
roc | Registrar of Companies | text: eq, neq, in, contains, starts_with, exists |
legal
legal_form | Legal form | text: eq, neq, in, contains, starts_with, exists |
company_class | Class (public/private/opc/government/section8) | text: eq, neq, in, contains, starts_with, exists |
listing_status | Listed or unlisted | text: eq, neq, in, contains, starts_with, exists |
entity_status | Entity status (ACTIVE/INACTIVE/...) | text: eq, neq, in, contains, starts_with, exists |
incorporation_date | Incorporation date | date: gte, lte, between, exists |
incorporation_year | Incorporation year | number: eq, gte, lte, between, exists |
company_age_years | Company age (years) | number: eq, gte, lte, between, exists |
mca_category | MCA category | text: eq, neq, in, contains, starts_with, exists |
mca_sub_category | MCA sub-category | text: eq, neq, in, contains, starts_with, exists |
authorised_capital | Authorised capital (INR) | number: eq, gte, lte, between, exists |
paid_up_capital | Paid-up capital (INR) | number: eq, gte, lte, between, exists |
lei_status | LEI registration status | text: eq, neq, in, contains, starts_with, exists |
lei_next_renewal | LEI next renewal date | date: gte, lte, between, exists |
gleif_category | GLEIF entity category | text: eq, neq, in, contains, starts_with, exists |
has_parent | Has a parent entity (GLEIF) | bool: eq |
gst_status | GST registration status | text: eq, neq, in, contains, starts_with, exists |
udyam_category | Udyam category (micro/small/medium) | text: eq, neq, in, contains, starts_with, exists |
industry
nic_code | NIC code (from CIN) | text: eq, neq, in, contains, starts_with, exists |
mca_nic_code | NIC code (MCA master) | text: eq, neq, in, contains, starts_with, exists |
nic_division | NIC 2-digit division | text: eq, neq, in, contains, starts_with, exists |
sector | Sector (NIC-derived) | text: eq, neq, in, contains, starts_with, exists |
industry | Industry (Wikidata/MCA) | text: eq, neq, in, contains, starts_with, exists |
any_industry | Sector or industry text | text: eq, neq, in, contains, starts_with, exists |
org_type | Org type (company/school/university/govt) | text: eq, neq, in, contains, starts_with, exists |
size
employee_count | Employees | number: eq, gte, lte, between, exists |
employee_range | Employee band | text: eq, neq, in, contains, starts_with, exists |
market
listing_date | NSE listing date | date: gte, lte, between, exists |
listed_years | Years since listing | number: eq, gte, lte, between, exists |
face_value | Face value (INR) | number: eq, gte, lte, between, exists |
nse_series | NSE series | text: eq, neq, in, contains, starts_with, exists |
nse_board | NSE board (main/sme) | text: eq, neq, in, contains, starts_with, exists |
market_lot | Market lot | number: eq, gte, lte, between, exists |
exchange | Exchange (NSE/BSE) | text: eq, neq, in, contains, starts_with, exists |
funding
total_funding_usd | Total funding (USD) | number: eq, gte, lte, between, exists |
last_funding_date | Last funding date | date: gte, lte, between, exists |
last_funding_round | Last round (seed/series_a/...) | text: eq, neq, in, contains, starts_with, exists |
funding_event_count | Funding events | number: eq, gte, lte, between, exists |
hiring
job_count_30d | Open jobs seen in 30 days | number: eq, gte, lte, between, exists |
job_count_90d | Jobs seen in 90 days | number: eq, gte, lte, between, exists |
is_hiring | Hiring now | bool: eq |
hiring_roles | Roles/skills in job posts | array: has_any, has_all, exists |
job_title | Any job title contains | text: eq, neq, in, contains, starts_with, exists |
job_location | Any job location contains | text: eq, neq, in, contains, starts_with, exists |
tech
tech | Technologies detected | array: has_any, has_all, exists |
tech_count | Number of technologies | number: eq, gte, lte, between, exists |
news
news_count_90d | News mentions (90 days) | number: eq, gte, lte, between, exists |
people
people_count | Known officers/founders | number: eq, gte, lte, between, exists |
person_name | Officer/founder name contains | text: eq, neq, in, contains, starts_with, exists |
education
board | School board (CBSE/ICSE/State) | text: eq, neq, in, contains, starts_with, exists |
management | Management (govt/private/aided) | text: eq, neq, in, contains, starts_with, exists |
university_type | University type (state/central/deemed/private) | text: eq, neq, in, contains, starts_with, exists |
tenders
tender_buyer | Publishes central-govt tenders (CPPP buyer) | bool: eq |
tender_open_count | Open CPPP tenders as buyer | number: eq, gte, lte, between, exists |
tender_last_published | Last tender published | date: gte, lte, between, exists |
tender_title | Any tender title/ref contains | text: eq, neq, in, contains, starts_with, exists |
quality
source_count | Number of sources agreeing | number: eq, gte, lte, between, exists |
confidence | Entity-resolution confidence | number: eq, gte, lte, between, exists |
updated_at | Last updated | date: gte, lte, between, exists |
has_website | Has website | bool: eq |
has_cin | Has CIN | bool: eq |
has_lei | Has LEI | bool: eq |