API reference
Base URL https://fin.ejiapi.com. All endpoints are GET and return JSON.
Quickstart
- Request a key. It arrives by email.
- Send it in the
x-api-keyheader.
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/mf/scheme-code/122639"
import requests
r = requests.get("https://fin.ejiapi.com/api/mf/scheme-code/122639",
headers={"x-api-key": "YOUR_KEY"}, timeout=30)
print(r.json()["data"]["latestNav"])
const res = await fetch("https://fin.ejiapi.com/api/mf/scheme-code/122639",
{ headers: { "x-api-key": "YOUR_KEY" } });
console.log((await res.json()).data.latestNav);
Authentication
Send your key as the x-api-key header. Two endpoints are open and need no key: GET /api/mf (the full scheme list) and GET /api/mf/health. Every other endpoint needs a valid key. A missing, wrong or revoked key gets 401.
Response format
Successful responses share one envelope:
{
"status": "success",
"statusCode": 200,
"message": "Scheme fetched successfully",
"data": { ... }
}Dates are ISO YYYY-MM-DD. Navs are numbers. Holding weights, quantities and market values are strings with fixed decimals so no precision is lost.
Errors
Errors use application/problem+json:
{
"title": "Scheme not found",
"status": 404,
"detail": "Scheme not found",
"instance": "/api/mf/scheme-code/100001"
}| Status | Meaning |
|---|---|
400 | A parameter is malformed, for example startMonth not in MM-YYYY. |
401 | Missing, invalid or revoked API key. |
404 | Unknown scheme, or no holdings disclosure loaded for that scheme. |
429 | Rate limit or monthly key quota reached. The message says which. |
Limits
- Rate limit: 120 requests a minute per key. The
X-RateLimit-Remainingresponse header shows what is left in the current minute. - Monthly quota: set per key. When it is used up you get
429 Monthly API quota exceededuntil the month rolls over, or until we raise it. Ask any time. - Size:
GET /api/mfreturns every scheme (several MB). Cache it, or use/api/mf/paginated.
List all schemes
/api/mfno keyThe full scheme master with latest and previous NAV. About 14,000 schemes.
Paginated list
/api/mf/paginated?page=1&size=20&category=keypage from 1. size 1 to 200 (default 20). category is an optional text match on the scheme category, for example Flexi Cap. The response has content and pagination (pageNumber, pageSize, totalPages, totalElements).
Search
/api/mf/search?query=parag%20parikh&limit=25keyquery at least 2 characters. limit 1 to 100 (default 25). Returns scheme objects.
{
"schemeCode": "122639",
"schemeName": "Parag Parikh Flexi Cap Fund",
"schemeCategoryLabel": "Equity Scheme - Flexi Cap Fund",
"schemeStructure": "Open Ended Schemes",
"planName": "Direct Plan",
"optionName": "Growth",
"latestNav": 89.2762,
"latestNavDate": "2026-10-27",
"previousNav": 89.3,
"previousNavDate": "2026-10-26",
"isinDivPayoutOrGrowth": "INF879O01027",
"isinDivReinvestment": null,
"amcId": 27,
"fundHouse": "PPFAS Mutual Fund"
}By scheme code
/api/mf/scheme-code/{code}keyThe scheme object above plus the 52-week fields 52WeekLowNav, 52WeekLowNavDate, 52WeekHighNav, 52WeekHighNavDate, computed from the stored history. They are omitted while a scheme has no stored history.
By ISIN
/api/mf/isin/{isin}keyThe same object, found by ISIN.
By name
/api/mf/scheme-name/{name}key/api/mf/scheme-name/{name}/variantskeyLook a scheme up by its name, or list the plan and option variants (Direct and Regular, Growth and IDCW) that share it. URL-encode the name.
Compare
/api/mf/compare?codes=122639,120503keyUp to five comma-separated scheme codes. Each item is the scheme object plus returns with cagr1y, cagr3y and cagr5y (percent, or null when there is not enough history).
AMCs
/api/mf/amcskeyEvery fund house with its amcId and activeFunds count.
Funds of an AMC
/api/mf/amc/{amcId}/fundskeyBy fund house name
/api/mf/fund-house/{name}keyNAV history
/api/mf/nav-history/scheme-code/{code}?start=2026-01-01&end=2026-10-27key/api/mf/nav-history/isin/{isin}?start=&end=keystart and end are optional ISO dates. Oldest first.
[
{ "date": "2026-10-26", "nav": 89.3 },
{ "date": "2026-10-27", "nav": 89.2762 }
]Rolling returns
/api/mf/scheme-code/{code}/rolling-summarykey/api/mf/isin/{isin}/rolling-summarykey{ "cagr1y": 14.2, "cagr3y": 18.9, "cagr5y": 21.4, "cagr10y": null }Annualised returns in percent from the stored history. A value is null when the scheme does not have that much history yet.
null here and omit the 52-week fields. The status page will not show this; ask us if a scheme matters to you.Holdings history
/api/mf/holdings-history/scheme-code/{code}?startMonth=01-2026&endMonth=09-2026keystartMonth and endMonth are optional and use MM-YYYY. Newest month first. Holdings in each month are sorted by weight.
{
"schemeCode": "122639",
"holdingsHistory": [
{
"holdingsMonth": "September",
"holdingsYear": 2026,
"holdingsAsOf": "2026-09-30",
"holdings": [
{
"name": "HDFC Bank Limited",
"displayName": "HDFC Bank Limited",
"isin": "INE040A01034",
"sector": "Banks",
"category": "Equity",
"weightage": "7.7500",
"quantity": "158729224.0",
"marketValue": "1124914.01",
"nseSymbol": "-",
"bseSymbol": "-"
}
]
}
]
}weightage is the percent of net assets. marketValue is in the unit the AMC reports (usually lakhs of rupees). nseSymbol and bseSymbol are "-", since AMC disclosures list ISINs, not exchange symbols. Holdings of all plans of a fund (Direct, Regular, Growth, IDCW) are the same, so any scheme code of the fund works.
404 with "No holdings disclosure for this scheme".Status
/api/mf/statusno keyEverything the status page shows, as JSON: overall state, components, uptime for 24 hours, 7 days, 30 days and per day, response times, data coverage (schemes, NAV history loaded, months of holdings) and incidents. Use it to monitor the API from your side. It is cached for a few seconds, so polling more than once a minute gains nothing.
{
"overall": "operational",
"generatedAt": 1793170000,
"components": [
{ "id": "api", "name": "API", "status": "operational", "detail": "Latest self check answered in 38 ms" },
{ "id": "nav", "name": "NAV refresh", "status": "operational", "detail": "Refreshed from AMFI every 6 hours" }
],
"uptime": { "day": 100, "week": 99.97, "month": 99.97, "days": [ { "date": "2026-10-28", "uptime": 100, "minutes": 642 } ] },
"latency": { "p50": 38, "p95": 61, "samples": 1438, "hourly": [ { "t": 1793166000, "ms": 40 } ] },
"data": { "schemes": 14414, "amcs": 56, "latestNavDate": "2026-10-27" },
"incidents": []
}status is one of operational, degraded, outage or unknown (no data yet). Times are unix seconds. Values here are illustrative; the live response has more fields.
Freshness and coverage
- NAV: checked against AMFI every 6 hours. AMFI publishes each day's NAVs in the evening. Some schemes report a day or more later, so
latestNavDatediffers between schemes. - Previous NAV: the last different NAV date we stored, so on a holiday it can be several days back.
- Holdings: month-end, loaded after the AMC publishes. A fund title that cannot be tied exactly to an AMFI fund name is skipped, never guessed.
Google Sheets
In a sheet: Extensions → Apps Script, paste, and save your key under Project Settings → Script properties as EJI_KEY.
function FUNDNAV(code) {
const key = PropertiesService.getScriptProperties().getProperty("EJI_KEY");
const res = UrlFetchApp.fetch("https://fin.ejiapi.com/api/mf/scheme-code/" + code,
{ headers: { "x-api-key": key } });
return JSON.parse(res.getContentText()).data.latestNav;
}
// =FUNDNAV(122639)Custom functions are cached by Sheets and recalculate when their input changes. To refresh daily, use a time-driven trigger that rewrites the values.