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

MethodPathWhatCredits
GET/api/v1/filtersFilter catalogue (fields, types, operators)free
POST/api/v1/companies/searchStructured search0.01/result
POST/api/v1/companies/nl-searchNatural-language search0.5 + 0.01/result
GET/api/v1/companies/enrich?domain=|name=|cin=|lei=|isin=|nse=Resolve + full profile1 (0 on no match)
GET/api/v1/companies/{id}?include=peopleProfile by id1 (+0.5/person)
GET/api/v1/companies/{id}/peopleOfficers / founders0.5/person
GET/api/v1/companies/{id}/jobs?live=1Jobs + hiring signals0.01/job (+1 live)
GET/api/v1/companies/{id}/news?live=1News + funding events0.1/item
GET/api/v1/companies/{id}/techstack?live=1Tech stack1
GET/api/v1/companies/{id}/tendersCentral-govt tenders published as buyer (CPPP), coming soon: returns an empty list today0.01/tender
GET/api/v1/identifiers/decode?value=Validate + decode CIN / GSTIN / PAN / Udyam / LEI / ISIN0
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/watchersCreate / list watchers0.25/new match, 2/change
DELETE/api/v1/watchers/{id}Delete watcherfree
POST/api/v1/datasets/exportBulk export (json/csv)0.005/row
GET/api/v1/usageBalance + usagefree
POST/api/mcpMCP (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_..." }
    }
  }
}
ToolDescription
list_filtersList every company search filter field with its type and allowed operators. Free.
search_companiesSearch 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_searchSearch 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_companyFind 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_companyFull profile of a company by company id (co_...). 1 credit.
get_company_peopleOfficers / founders / CEO of a company from public business sources (no personal contact data). 0.5 credits per person.
get_company_jobsJob posts and hiring signals. live=true checks public ATS boards now (+1 credit). 0.01 credits per job.
get_company_newsRecent news and funding events. live=true refreshes from GDELT now. 0.1 credits per news item.
get_company_techTechnologies detected on the company website. live=true rescans the home page now (1 credit).
get_company_tendersComing 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_identifierValidate 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_datasetExport every company matching a search as JSON or CSV (max 50,000 rows). 0.005 credits per row.
create_watcherWatch companies for field changes (kind=company, company_ids) or a saved search for new matches (kind=search, filters). Optional webhook_url.
list_watchersList watchers and recent change events. Free.
delete_watcherDelete a watcher by id. Free.
get_usageCredit 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

idCompany idtext: eq, neq, in, contains, starts_with, exists
nameDisplay nametext: eq, neq, in, contains, starts_with, exists
legal_nameRegistered legal nametext: eq, neq, in, contains, starts_with, exists
any_nameName or aliastext: eq, neq, in, contains, starts_with, exists
domainWebsite domaintext: eq, neq, in, contains, starts_with, exists
websiteWebsite URLtext: eq, neq, in, contains, starts_with, exists
cinCIN (MCA)text: eq, neq, in, contains, starts_with, exists
leiLEI (GLEIF)text: eq, neq, in, contains, starts_with, exists
isinISINtext: eq, neq, in, contains, starts_with, exists
nse_symbolNSE symboltext: eq, neq, in, contains, starts_with, exists
wikidata_idWikidata QIDtext: eq, neq, in, contains, starts_with, exists
gstinGSTINtext: eq, neq, in, contains, starts_with, exists
udyam_numberUdyam registration no.text: eq, neq, in, contains, starts_with, exists
descriptionDescription texttext: eq, neq, in, contains, starts_with, exists

location

countryCountry (ISO-2)text: eq, neq, in, contains, starts_with, exists
stateState / UTtext: eq, neq, in, contains, starts_with, exists
cityCitytext: eq, neq, in, contains, starts_with, exists
pincodePIN codetext: eq, neq, in, contains, starts_with, exists
addressRegistered address texttext: eq, neq, in, contains, starts_with, exists
regionRegion (north/south/east/west)text: eq, neq, in, contains, starts_with, exists
is_metroIn a metro citybool: eq
hq_countryHQ country (GLEIF)text: eq, neq, in, contains, starts_with, exists
rocRegistrar of Companiestext: eq, neq, in, contains, starts_with, exists

legal

legal_formLegal formtext: eq, neq, in, contains, starts_with, exists
company_classClass (public/private/opc/government/section8)text: eq, neq, in, contains, starts_with, exists
listing_statusListed or unlistedtext: eq, neq, in, contains, starts_with, exists
entity_statusEntity status (ACTIVE/INACTIVE/...)text: eq, neq, in, contains, starts_with, exists
incorporation_dateIncorporation datedate: gte, lte, between, exists
incorporation_yearIncorporation yearnumber: eq, gte, lte, between, exists
company_age_yearsCompany age (years)number: eq, gte, lte, between, exists
mca_categoryMCA categorytext: eq, neq, in, contains, starts_with, exists
mca_sub_categoryMCA sub-categorytext: eq, neq, in, contains, starts_with, exists
authorised_capitalAuthorised capital (INR)number: eq, gte, lte, between, exists
paid_up_capitalPaid-up capital (INR)number: eq, gte, lte, between, exists
lei_statusLEI registration statustext: eq, neq, in, contains, starts_with, exists
lei_next_renewalLEI next renewal datedate: gte, lte, between, exists
gleif_categoryGLEIF entity categorytext: eq, neq, in, contains, starts_with, exists
has_parentHas a parent entity (GLEIF)bool: eq
gst_statusGST registration statustext: eq, neq, in, contains, starts_with, exists
udyam_categoryUdyam category (micro/small/medium)text: eq, neq, in, contains, starts_with, exists

industry

nic_codeNIC code (from CIN)text: eq, neq, in, contains, starts_with, exists
mca_nic_codeNIC code (MCA master)text: eq, neq, in, contains, starts_with, exists
nic_divisionNIC 2-digit divisiontext: eq, neq, in, contains, starts_with, exists
sectorSector (NIC-derived)text: eq, neq, in, contains, starts_with, exists
industryIndustry (Wikidata/MCA)text: eq, neq, in, contains, starts_with, exists
any_industrySector or industry texttext: eq, neq, in, contains, starts_with, exists
org_typeOrg type (company/school/university/govt)text: eq, neq, in, contains, starts_with, exists

size

employee_countEmployeesnumber: eq, gte, lte, between, exists
employee_rangeEmployee bandtext: eq, neq, in, contains, starts_with, exists

market

listing_dateNSE listing datedate: gte, lte, between, exists
listed_yearsYears since listingnumber: eq, gte, lte, between, exists
face_valueFace value (INR)number: eq, gte, lte, between, exists
nse_seriesNSE seriestext: eq, neq, in, contains, starts_with, exists
nse_boardNSE board (main/sme)text: eq, neq, in, contains, starts_with, exists
market_lotMarket lotnumber: eq, gte, lte, between, exists
exchangeExchange (NSE/BSE)text: eq, neq, in, contains, starts_with, exists

funding

total_funding_usdTotal funding (USD)number: eq, gte, lte, between, exists
last_funding_dateLast funding datedate: gte, lte, between, exists
last_funding_roundLast round (seed/series_a/...)text: eq, neq, in, contains, starts_with, exists
funding_event_countFunding eventsnumber: eq, gte, lte, between, exists

hiring

job_count_30dOpen jobs seen in 30 daysnumber: eq, gte, lte, between, exists
job_count_90dJobs seen in 90 daysnumber: eq, gte, lte, between, exists
is_hiringHiring nowbool: eq
hiring_rolesRoles/skills in job postsarray: has_any, has_all, exists
job_titleAny job title containstext: eq, neq, in, contains, starts_with, exists
job_locationAny job location containstext: eq, neq, in, contains, starts_with, exists

tech

techTechnologies detectedarray: has_any, has_all, exists
tech_countNumber of technologiesnumber: eq, gte, lte, between, exists

news

news_count_90dNews mentions (90 days)number: eq, gte, lte, between, exists

people

people_countKnown officers/foundersnumber: eq, gte, lte, between, exists
person_nameOfficer/founder name containstext: eq, neq, in, contains, starts_with, exists

education

boardSchool board (CBSE/ICSE/State)text: eq, neq, in, contains, starts_with, exists
managementManagement (govt/private/aided)text: eq, neq, in, contains, starts_with, exists
university_typeUniversity type (state/central/deemed/private)text: eq, neq, in, contains, starts_with, exists

tenders

tender_buyerPublishes central-govt tenders (CPPP buyer)bool: eq
tender_open_countOpen CPPP tenders as buyernumber: eq, gte, lte, between, exists
tender_last_publishedLast tender publisheddate: gte, lte, between, exists
tender_titleAny tender title/ref containstext: eq, neq, in, contains, starts_with, exists

quality

source_countNumber of sources agreeingnumber: eq, gte, lte, between, exists
confidenceEntity-resolution confidencenumber: eq, gte, lte, between, exists
updated_atLast updateddate: gte, lte, between, exists
has_websiteHas websitebool: eq
has_cinHas CINbool: eq
has_leiHas LEIbool: eq
API and MCP docs for Indian company data