Quick start
https://api.tigzig.com/mf/mcphttps://api.tigzig.com/mf/v1Documentation
The full reference. Every endpoint, every field, and every enforced limit with the message you get when you cross it. Rendered from the running service, so it is never a copy that can fall behind.
The machine contract for this API. The site-wide directory of every TigZig API is the RFC 9727 catalog at api.tigzig.com/.well-known/api-catalog.
What you can call
9 endpoints. Request bodies, every field and every enforced limit are in the full reference.
| GET | /mf/v1/ | API catalog: every endpoint, the data schema, and worked examples |
| GET | /mf/v1/details | Scheme details for up to 50 schemes |
| GET | /mf/v1/download | Download full NAV dataset |
| GET | /mf/v1/download/{dataset} | Download another MF dataset (scheme details, data quality) |
| GET | /mf/v1/downloads/manifest | Download file sizes and metadata |
| GET | /mf/v1/nav | NAV data by AMFI code or ISIN (single or bulk) |
| GET | /mf/v1/schemes/{code}/details | Scheme details: AUM, scheme document, TER for one scheme |
| GET | /mf/v1/schemes/{code}/nav | NAV data for a single scheme (REST path form) |
| GET | /mf/v1/search | Search and browse schemes: name/code search + metadata filters (category, AMC, plan, dates) |
Live tool
Search schemes, compare NAV history and export, all in the browser.
Overview
The complete Indian mutual fund NAV history - every scheme, every day, April 2006 onward - is rebuilt 3x daily and published as a single file in Parquet, CSV, TSV and SQLite. Perfect for a one-off analysis: grab the file and open it in Excel, pandas, or your own database.
No coding needed - download it by hand from the MFPRO app (opens straight to Download Full Database): pick a format, click, done. Prefer to automate it? One API call pulls the entire dataset - see Download the whole database in one call below.
Only need the current picture, not the history? One row per scheme with the master data, latest NAV and average AUM together - 23 columns, about 9.7 MB of plain CSV, in roughly a second: GET /mf/v1/download/amfi_nav_master_latest.csv. No unzipping, opens anywhere.
Need the fund facts rather than NAVs? One row per scheme with fund size, expense ratio, riskometer, benchmark and fund managers - about 11,400 rows and 61 columns, ~1.3 MB: GET /mf/v1/download/scheme_details_latest.parquet (or .csv.gz).
A free, open AMFI mutual fund NAV API for India - no key, no sign-up. AMFI publishes NAVs as a giant daily text dump; this API turns it into clean, queryable data and lets you download the entire NAV history - every scheme, every day - in a single call.
- 37M+ daily NAV records, refreshed 3x daily from AMFI.
- 38,000+ schemes across all scheme types, including matured (open-ended, closed-ended, interval).
- History back to April 2006, including matured closed-ended and interval schemes.
- AMFI code OR ISIN - use whichever your integration speaks. Auto-detected, no separate endpoint needed.
- Search or browse - find a fund by name, or list every scheme in a category, AMC, plan or launch window without knowing a single code.
- Single, bulk, whole-universe snapshot, or full-dataset - one scheme, up to 50 in a single call, every scheme's master data + latest NAV + average AUM in one 23-column CSV, or the entire 37M-row history in one file.
- No authentication. No key, no sign-up. 300 requests/min per IP.
The same MF NAV data powers the MFPRO analytics app.
Using the API
1. Find a scheme - search by name, or browse by category2 examples
Know the fund name? Search it:
GET https://api.tigzig.com/mf/v1/search?q=hdfc flexi cap
Returns matching scheme codes and names (e.g. 118955 = HDFC Flexi Cap Fund - Growth - Direct Plan).
SIF. Search covers mutual funds by default. Add source=sif for Specialized Investment Funds (SIF) only, or source=all for mutual funds first and then SIF. q=SIF-120 finds one SIF by its code. SIF rows have source and sif_code.
Do not have a name to search for? Browse instead. The same endpoint filters on scheme metadata, so q is optional - pass filters on their own and you get the matching list back:
GET https://api.tigzig.com/mf/v1/search?category=small cap&plan=direct&option=growth
GET https://api.tigzig.com/mf/v1/search?amc=icici,aditya birla&group=equity&exclude=index
GET https://api.tigzig.com/mf/v1/search?group=equity&first_date_from=2015-01-01&first_date_to=2016-12-31
You can filter on AMC, category group, SEBI sub-category, scheme type, plan, option, ISIN, TXIC code, active-or-matured, and launch / last-NAV date windows. The full list with descriptions is in the API Endpoints reference below. What each of those values means - and the caveats that change how you read it - is in the data dictionary (Markdown twin: https://www.tigzig.com/md/mfpro/data-dictionary.md).
The rules are the same for every text filter: contains-matched and case-insensitive (category=small finds Small Cap Fund), a comma means OR within one filter, different filters AND together, and exclude= is the NOT. Repeating a filter does the same thing as a comma - ?amc=icici&amc=hdfc is identical to ?amc=icici,hdfc, the same merge rule schemes= uses on the NAV endpoints - so a form or client that emits repeated params gets the union rather than losing all but the last one. One scope rule worth knowing before you trust a result: exclude= reads the scheme name and the AMC name only, never the category - so exclude=value drops an index fund with "Value" in its name and does not drop the Value Fund category. To remove a category, select the ones you want with category= instead. A browse with no q returns live schemes by default - add active=all to include matured ones. Page through with limit (max 100) and offset; the response carries total_matches.
Parameter names are strict on this endpoint. An unknown parameter is a 400, not a silent ignore - so a typo like ?catgeory=small can never quietly hand you the wrong universe of funds. The same instinct runs through the rest of the validation: an impossible date window, a non-numeric limit, a blank q, or a scalar parameter repeated with two different values all fail loudly and name the problem, instead of returning an empty or arbitrary result you would have to reverse-engineer.
Guessed a filter value wrong? A zero-match browse tells you the valid values for the filters you used - the category groups, the SEBI sub-categories, plans, options, AMC names - so you can fix the call from the response itself. And the shapes stay predictable: a plain q search returns exactly the compact result it always did, while adding any filter returns a richer row carrying the full scheme metadata (AMC, group, category, plan, option, first and last NAV dates, TXIC code).
2. NAV history by AMFI code or ISIN (one or more)3 examples
Pass one identifier or several - AMFI scheme code or ISIN, mixed freely - and get the ENTIRE history back, no pagination. scheme= takes a single id or a comma-separated list; isin= / isins= work as synonyms. Both identifier styles are auto-detected (numeric = AMFI code, 12-char starting with IN = ISIN). Add &since=YYYY-MM-DD / &to=YYYY-MM-DD to bound the window:
GET https://api.tigzig.com/mf/v1/nav?scheme=118955&since=2020-01-01
GET https://api.tigzig.com/mf/v1/nav?scheme=INF174K01LT0
GET https://api.tigzig.com/mf/v1/nav?scheme=118955&since=2024-01-01&to=2024-12-31
Same call in REST path form:
GET https://api.tigzig.com/mf/v1/schemes/118955/nav
GET https://api.tigzig.com/mf/v1/schemes/INF174K01LT0/nav
SIF. Specialized Investment Funds work on both forms. A SIF code works with or without the prefix (120 or SIF-120), and so does a SIF ISIN. Every mutual fund code is 100027 or above and every SIF code is below 100000. A SIF reply has the same shape plus source: "SIF" and sif_code. SIF NAVs can be a day behind the mutual funds, and latest_available_date shows each scheme's last NAV.
Before computing returns. NAV is as AMFI filed it and is not adjusted for unit splits or face-value changes, so check for a one-day move of more than 2x first. About 400,000 rows have a NAV of 0, from segregated portfolios, wound-up plans and a few filing days. Filter on nav > 0. The API adds a warning to a reply when the rows it returns hold a NAV of 0 or below, or a one-day move of more than 2x. One ISIN can sit on several scheme codes over time. A lookup by ISIN returns the newest code, and an older code's series is reached by its scheme code. About 20 ISINs in the history are not valid ISINs as filed.
Only need the most recent NAV, not the whole history? Add latest=true to get exactly one row per scheme - the latest published NAV. It works on single, bulk and path forms (and is case-insensitive); add &to=YYYY-MM-DD for the latest NAV as of a date, e.g. a quarter-end:
GET https://api.tigzig.com/mf/v1/nav?scheme=100033&latest=true
GET https://api.tigzig.com/mf/v1/nav?scheme=100033&latest=true&to=2026-06-30
An empty window (no rows in your date range, or the day's NAV not published yet) returns count: 0 with that scheme's first_available_date and latest_available_date, plus a Last-Modified header - so a poller learns the real data range without a second call, and can send If-Modified-Since for a cheap 304.
3. Bulk - up to 50 schemes in ONE call1 example
For portfolios and multi-fund analytics, batch up to 50 identifiers (AMFI codes and ISINs can be mixed):
GET https://api.tigzig.com/mf/v1/nav?schemes=118955,120468,INF174K01LT0
Response shape wraps the per-scheme results under schemes with a top-level not_found list for any identifier that did not resolve. An unknown or malformed entry never fails the batch - the valid schemes still come back.
Single and bulk are the same endpoint, recently unified so you never have to pick which form to use. One identifier returns that scheme's rows directly; several (or schemes=) returns the wrapped shape above. Existing single-identifier and bulk calls are unchanged and keep working exactly as before.
4. The whole scheme universe in one file - one call, ~1 second2 examples
If you do not need history, this one file replaces the lot: one row per scheme, 38,000+ rows, 23 columns, about 9.7 MB as plain CSV (1.1 MB compressed). It carries the scheme master, the latest NAV, and each scheme's average AUM together:
GET https://api.tigzig.com/mf/v1/download/amfi_nav_master_latest.csv
Raw text/csv - it opens in a browser or Excel, and pd.read_csv works straight off the URL with no unzipping. Also latest.csv.gz, latest.csv.zip and latest.parquet (latest.csv is the same file as bare latest). The 23 columns cover identity (scheme code, both ISINs, name, AMC, TXIC code), classification (type, category, sub-category, group, plan, option), lifecycle (first and last NAV dates, active and stale flags), size (average AUM with its quarter label and ISO quarter-end), the NAV itself (date and value), and source last (MF or SIF). The exact column names and their per-column caveats are machine-readable in the API catalog under schema.latest_snapshot - read them there rather than from this page, so a column rename can never leave you working from a stale list.
Two grouping columns, and they answer different questions. category_group_clean is the analysis lens - a small, stable set (Equity / Debt / Hybrid / Other) that every raw name maps into deterministically, so a group-by is comparable across the whole history. category_group is the raw AMFI header as filed, which currently carries 20+ coexisting values because fund houses are still re-filing under SEBI's 2026 recategorisation. Use the clean one for reporting, the raw one when you want the mid-level detail or need to see exactly what AMFI filed. Note the clean set folded Solution Oriented and Fund of Funds into Other Scheme under the 2026 rules, so it is four values now rather than the six you may have seen earlier.
Two ISIN columns. isin is the payout or growth ISIN; isin2 is the reinvestment ISIN where one exists. They are sub-options of the same IDCW plan, not different funds - same scheme, same NAV row. Reinvestment ISINs resolve for all active schemes and most matured ones (about 7,000 mappings), so an ISIN lookup succeeds whichever of the two a client happens to hold.
import pandas as pd
df = pd.read_csv("https://api.tigzig.com/mf/v1/download/amfi_nav_master_latest.csv")
live = df[df.is_active] # the ~8,600 schemes still publishing
big = live.nlargest(20, "aaum_cr_quarterly_avg") # largest by average AUM
Three things to know before you trust a number from this file. Each one produces a wrong answer silently rather than an error.
1. It is each scheme's most recent NAV, not today's NAV for every row. Every scheme is included, matured ones too, so a fund that wound up in 2008 sits there with its final 2008 NAV. About 8,600 rows are live; the other ~29,000 are closed schemes frozen at their last NAV, and roughly 2,300 of those carry a final NAV of exactly 0.00 - AMFI's own closing entry, kept as filed. Read a 0.00 on an inactive row as end of life rather than a price, and exclude those rows before you average anything. Filter is_active, read nav_date. Deliberate - it keeps the file survivorship-bias-free, like the full dataset.
2. One scheme code is one plan-and-option variant, not a fund. To size a fund you sum its family. Aditya Birla Sun Life Value Fund is four codes - 5,628 + 705 + 68 + 11 = about 6,412 Cr. Quote any single row and you understate the fund, in that case by nine tenths. Note also that the oldest code in a family often carries plan Other, because it predates the 2013 Direct/Regular split.
3. Sort quarters on aaum_quarter_end, never on aaum_quarter. The label is text, so alphabetically December-2025 < June-2026 < March-2026, which is not chronological. aaum_quarter_end is the ISO twin (2025-12-31, 2026-03-31, 2026-06-30) and sorts correctly.
On AUM specifically: aaum_cr_quarterly_avg is the average of daily net assets over the quarter, per SEBI's definition - not a month-end or quarter-end balance - so a scheme launched mid-quarter reads low against a full-quarter peer. It is populated for about 8,400 rows (live schemes with a disclosed quarter); matured schemes have it blank. Renamed from aaum_cr on 2026-08-12 (manifest schema_version 2) because the old name read like a point-in-time AUM. Same values, same units, same position - if your code does df['aaum_cr'] it will raise a KeyError, so rename the reference and nothing else changes. The per-column definitions, including this one, are machine-readable in the API catalog under schema.latest_snapshot.column_notes - that is the canonical home, so an agent gets the caveats without reading this page.
5. Download the WHOLE database in one call3 examples
Instead of looping over 38,000 schemes, grab everything at once - a single pre-generated file for all 37M+ rows, served via Cloudflare R2 (free egress, edge-cached):
GET https://api.tigzig.com/mf/v1/download/amfi_nav_master.parquet
Seven format values (default parquet): parquet (~170 MB), csv.gz / csv.zip / tsv.gz / tsv.zip (~235 MB), sqlite.gz / sqlite.zip (~1.3 GB). Bare sqlite is an alias for sqlite.gz. The SQLite file unpacks to about 5.5 GB, so allow about 7 GB free. Its nav is a binary float, so round to 4 places; the Parquet file is exact. Load straight into pandas:
import pandas as pd
df = pd.read_parquet("https://api.tigzig.com/mf/v1/download/amfi_nav_master.parquet")
print(df.shape) # every scheme, every day
df["nav"] = df["nav"].astype(float) # parquet stores nav as DECIMAL - see note below
SIF are in the same files. Specialized Investment Funds (SIF) sit below the mutual funds in every NAV file, full history and snapshot. The last column, source, says which: MF or SIF. Filter on source = 'MF' (or 'SIF') before totals across schemes. A category filter alone does not separate them, because SIF uses the same category groups. A SIF scheme_code is the number in AMFI's SIF code (SIF-120 is 120); every mutual fund code is 100027 or above.
One parquet quirk worth knowing before it bites. In the parquet downloads (both the full history and the snapshot) nav is a DECIMAL logical type, so pandas hands you Python Decimal objects rather than floats. Aggregations like .mean() still work, which is what makes this easy to miss - but arithmetic against a float, df.nav * 1.05, raises TypeError: unsupported operand type(s). Cast once on load, as above. The CSV and TSV downloads give you plain floats and need no cast, and note it is nav specifically - aaum_cr_quarterly_avg already comes through as a float. The decimal type is deliberate: it preserves AMFI's filed precision exactly rather than rounding it into a float.
Authoritative per-file list (formats, exact sizes, row count, last-refresh time): GET /mf/v1/downloads/manifest. It also reports a validation block confirming the generated files match the source row count, and a sources block with the rows for MF and for SIF. The manifest supports If-None-Match for cheap daily re-polls (returns 304 Not Modified when unchanged) - poll the manifest, and only re-download a file when the manifest says it changed. The download files themselves now honour conditional requests too: every 200 carries Content-Length, ETag and Last-Modified, and sending If-None-Match or If-Modified-Since returns 304 Not Modified with no body. So the cheap daily loop is: fetch once, keep the ETag, re-poll conditionally, and only receive bytes on the days the file actually changed.
File-name addresses. Every file also has an address that ends in its own file name, for example https://api.tigzig.com/mf/v1/download/amfi_nav_master.parquet. curl -O and wget save it under the right name. The ?format= form keeps working. Every file's address: https://api.tigzig.com/downloads/mf.
Query a parquet file in place. Parquet files support HTTP range requests, so DuckDB, pyarrow, polars or a browser can query them in place and read only the parts a query needs. For browsers, responses expose Content-Range, Content-Length and ETag to cross-origin JavaScript.
SELECT count(*) FROM read_parquet('https://api.tigzig.com/mf/v1/download/amfi_nav_master.parquet');
6. Scheme details: fund size, scheme document and expense ratio2 examples
One row per scheme with what the MFPRO Fund page shows. It covers AMFI's daily fund size for all plans, the riskometers and benchmark, the scheme summary document (fund managers, launch and NFO dates, filed benchmarks, objective, exit load, SIP and redemption terms) and the latest expense ratio for the Regular and Direct plans. About 11,400 rows and 61 columns, 1.3 MB as parquet.
GET https://api.tigzig.com/mf/v1/download/scheme_details_latest.parquet
GET https://api.tigzig.com/mf/v1/download/scheme_details_latest.csv.gz
For one scheme or a short list, the same values come back as JSON. Codes and ISINs both work, up to 50 per call:
GET https://api.tigzig.com/mf/v1/schemes/118989/details
GET https://api.tigzig.com/mf/v1/details?schemes=118989,120503,INF179K01XQ0
SIF. Both details calls also take SIF codes and SIF ISINs, and each SIF item has source and sif_code. The scheme_details_latest download has SIF rows after the mutual funds, with source as the last column. The data quality file covers mutual funds only; SIF's open issues are on sif.tigzig.com. SIF has no daily fund AUM, because AMFI's daily AUM feed does not include SIF, so amfi_daily is empty on every SIF reply. The quarterly average AUM is filled for mutual funds and for most SIF schemes.
Both replies wrap the result in data, which /nav does not. For one scheme, data is an object. For a list, data is an array, next to count, not_found (codes we do not recognise) and no_details (real schemes with no details row). Inside each scheme, the amfi_daily, ssd and ter groups can each be null. About a quarter of schemes have no TER filing, so check for ter: null before you read from it.
Joining to NAV. Scheme details has one row per scheme_code. NAV has one row per scheme per date. Join the two on scheme_code.
Fund size repeats on every plan. The columns that start with amfi_daily_, ssd_ and ter_ describe the whole fund, so each plan's row carries the same value. To total fund size, add up amfi_daily_fund_aum_cr_all_plans only on rows where fund_dedup_flag is true. A fund has four plans on average, so summing every row overstates the total about four times. The column definitions are in the MFPRO data dictionary.
A second file lists the rows that could not be matched cleanly between AMFI's daily feed and the scheme documents, with the reason for each: GET /mf/v1/download/data_quality.csv (or json). Row counts, sizes and source dates for both files are in the manifest under datasets.
Errors1 example
Every error is a JSON body you can act on in code. Switch on the top-level code. It is always present and always an UPPERCASE string, for example NOT_FOUND, INVALID_DATE_FORMAT or UNRECOGNIZED_PARAMETER. A real reply for an unknown scheme:
{ "code": "NOT_FOUND", "path": "/mf/v1/nav", "detail": "No NAV data found for identifier 999999.",
"error": { "code": "NOT_FOUND", "message": "...", "docs_url": "https://api.tigzig.com/mf/v1/docs",
"hint": "... https://api.tigzig.com/mf/v1/search?q=<fund name>" },
"help": { "catalog": "https://api.tigzig.com/mf/v1/", "docs": "https://www.tigzig.com/apis/mf-nav" } }
Most MF errors carry error as an object like the one above. The shared replies for an unknown path (404), a wrong method (405) and the rate limit (429) carry error as a short lowercase label instead, next to the same top-level code. So read code and the shape of error stops mattering. The help block points at this API's machine catalog and docs page. A 429 also carries reason, retry_after_seconds and a Retry-After header. One exception for now: a download 400 for an invalid format has no top-level code yet, so read error.code there. The full list of codes is under error_shape.known_codes in the machine catalog.
A 404 for an unknown scheme also carries an error.hint pointing you straight to /mf/v1/search to resolve a fund name to its code - so an agent can self-correct from the first failed response instead of guessing identifiers. Likewise, calling /nav with a category= or amc= filter (a natural guess) returns a 400 that points you to the browse filters on /search, and tells you to call /nav with the codes you picked.
If the identifier is a corrupted ISIN - it fails the ISIN check-digit test (the 12th character is arithmetic over the first eleven) - the 404 says exactly that and tells you retrying will not help, so you fix it at the source rather than loop. A well-formed ISIN that simply is not in AMFI's data still gets the search-by-name hint. You do not need to run your own validator; the API does the arithmetic and tells you which case you are in.
Compatibility aliases140 words
The canonical names above are all you need - scheme, schemes, since, to, q, and the paths in steps 1-4. For convenience the API also accepts a few aliases (handy if you are porting from another naming convention; you never have to use them, and they are intentionally kept out of the OpenAPI spec and the machine catalog):
- Param synonyms on the NAV endpoints:
scheme_codeforscheme;from,start,start_dateforsince;end,end_date,untilforto. - On
/search:nameandqueryforq(e.g./mf/v1/search?name=axis focused). - Paths that route to
GET /mf/v1/nav:/mf/v1/nav-history,/mf/v1/history,/mf/v1/nav/history,/mf/v1/series. - Paths that route to the canonical
/mf/v1/schemes/{code}/nav:/mf/v1/nav/{code},/mf/v1/schemes/{code},/mf/v1/scheme/{code},/mf/v1/history/{code},/mf/v1/schemes/{code}/history,/mf/v1/series/{code}(the singular/mf/v1/scheme/{code}/navworks too).
MCP Server (for AI agents)
Connect an AI agent (Claude.ai, Cursor, Continue, any MCP client) and let it find schemes and pull NAVs on its own. Open, no key:
https://api.tigzig.com/mf/mcp- Streamable HTTP.
The server identifies as Tigzig MF NAV (India) and has three tools:
mf_search- find scheme codes by name, fund house, category or ISIN, with filters.mf_nav- NAV history for up to 50 schemes, withlatest=trueor asince/towindow.mf_details- scheme details for up to 50 schemes: fund size, expense ratio, riskometer, benchmark and fund managers.
For the whole dataset, use the bulk download files above, not the MCP tools.
Add to Claude.ai: Settings -> Connectors -> Add custom connector -> paste the URL -> approve. The same URL works in Cursor, Continue and any MCP client.
What is new
- 22 Oct 2026 SIFs now in the MF API, MCP server and data files
- 11 Oct 2026 Download hub: 46 datasets, 172 files in one indexAll APIs
- 8 Oct 2026 Query the MF NAV parquet file with SQL from a browser or a Worker using lakeql, reading only the byte ranges a query needs
- 8 Oct 2026 Scheme details refresh daily, with a change report for the 7 October run, and an MCP server for AI agents with three tools
- 4 Oct 2026 Scheme details are live: fund size, fund manager, TER and BER, benchmark and riskometer for about 2,100 funds, refreshed four times a day
Everything that changed, newest first - the full log across every API and app.
Guides
This page is the reference - what the endpoints are and how to call them. The guides below are the long-form versions, with worked examples and the edges you only meet in real use:
- Free AMFI mutual fund NAV API for India - Start here. what the data is, how to pull one scheme, and how to take the whole dataset in a single call.
- Demystifying the API errors - what each error actually means and what to do about it, instead of guessing from a status code. Covers every TigZig API, not just this one.
- Your agents and scripts have been talking to me - what real callers actually do, read out of the server logs: the common mistakes, what works, and the patterns worth copying.
- Is it you, or is it me? - the public status page for every TigZig API, so you can check whether a failure is at your end or ours before you start debugging.
- Search filters across 12 fields on a scheme - the full walkthrough of the browse filters on this page: how they combine, what a wrong call looks like, and the limits worth knowing before you rely on a result.
- Three ways to pull NAVs in far fewer calls - batching, the bulk files and the Parquet route, with the trade-off on each so you can pick one to suit the size of your job.
- Pull NAVs straight into Excel - the spreadsheet route for 50, 100 or more schemes, with no code involved.
Each is a plain page with a Markdown twin, so you can hand a URL straight to an agent. Come back to this page when you want parameter-level detail. There is also a shorter update post on the forgiving identifier intake, latest=true and the freshness metadata - all three are documented above.
What you can build
- A returns calculator (1Y / 3Y / 5Y / SIP / rolling returns) over the full history.
- Backtests, fund-of-funds, and rebalancing strategies.
- Your own dashboards and notebooks, without scraping AMFI.
- Research-grade history, no subscription paywall.
Why one-call download matters: every other route makes you paginate - one scheme, one request, rate-limited, often capped at recent history. For any real analysis you need all of it, locally. One call, one file, done.
Documentationfield guide and data dictionary
Full documentation for the data behind this API - every field, every metric, and how the data is assembled - lives in one place in the MFPRO app:
What you will find there:
- Data Dictionary - every field in the NAV database with types, meanings and known caveats, table by table.
- Scheme Universe field guide - the 38,000+ scheme universe: how AMFI categories work, which fields to use and avoid, the old-to-modern category mapping, and the TXIC scheme identifier.
- How the Data Is Built - sources, the 3x daily sync, the July 2026 historical backfill, validation discipline and honest limitations.
- Performance & Risk methodology - all 21 metrics with formulas and worked examples.
- Composition methodology - the portfolio holdings pipeline: AMC disclosures, ISIN mapping, validation checks and the monthly refresh.
An AMC merger can split a fund's history across two scheme codes, so an older code may return a short or empty series while the fund continues under a newer code. The How the Data Is Built doc above walks through this with a worked example.
Reading this as an agent? Three of those docs are mirrored on this site as plain pages, each with a Markdown twin, so you can read them without running JavaScript:
- Data dictionary - every column in the NAV and scheme-metadata tables, with types, meanings and the caveats that change how you read a number. Markdown:
https://www.tigzig.com/md/mfpro/data-dictionary.md - Scheme universe field guide - what the category, plan and option values mean, the old-to-modern category mapping, and the TXIC identifier. Markdown:
https://www.tigzig.com/md/mfpro/scheme-universe.md - How the data is built - sources, sync cadence, the July 2026 historical backfill, and the honest limitations. Markdown:
https://www.tigzig.com/md/mfpro/how-the-data-is-built.md
Read the data dictionary before drawing conclusions from a filtered browse. It is where the non-obvious rules live - why active means "published a NAV in the last 45 days", why some older schemes carry a blank sub-category on purpose, and why a pre-2010 closed-ended series has roughly weekly gaps rather than missing days.
Rate limitsthe per-IP limits in full
Published so a well-behaved client can plan around them. These are per-IP limits:
- Per IP: 300 requests / minute.
- Downloads, range reads (HTTP 206): 3,000 / minute and 25,000 / day.
- Downloads, whole-file (200 / 304 / HEAD): 60 / minute and 500 / day.
You get a 429 with Retry-After. The body is product-aware: it names MF's own bulk paths and carries help: { catalog, docs }.
Avoiding 429s: The bulk form /nav?schemes=A,B,... takes up to 50 schemes in one call - far cheaper than one call per scheme. For the whole dataset use /download.
Every successful response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix epoch seconds), read straight from the running limiter, and Retry-After is set on 429. The current numbers are also published as machine-readable JSON at https://api.tigzig.com/mf/v1/, derived from live config. Read those at runtime rather than hard-coding the figures above - limits change, and these channels change with them.
On the download endpoints the headers differ, because a different layer enforces them: you get X-RateLimit-Limit, -Remaining and -Window plus a matching -Day trio (-Limit-Day, -Remaining-Day, -Window-Day) and NO -Reset. The origin endpoints are the other way round: -Reset, no -Day.
The shared replies for an unknown path (404), a wrong method (405) and the rate limit (429) are a JSON envelope: { code, error, status, path, message, help: { catalog, docs } }. code is an UPPERCASE string such as NOT_FOUND and is the field to switch on; error is a short lowercase label (not_found, method_not_allowed, ...). help points at the machine catalog (https://api.tigzig.com/mf/v1/) plus this docs page, so a client that hits an error can self-recover.
Sourceterms in full
Source: AMFI (Association of Mutual Funds in India). Provided as is, with no guarantee of accuracy, completeness or availability and no support commitment.
Try it2 examples, paste into a browser
No key, no signup.
https://api.tigzig.com/mf/v1/search?q=parag%20parikh
{
"query": "parag parikh",
"count": 28,
"results": [
{
"scheme_code": 122639,
"scheme_name": "Parag Parikh Flexi Cap Fund - Direct Plan - Growth",
"isin": "INF879O01027",
"isin2": null,
"category_sub": "Flexi Cap Fund",
"is_active": true,
"relevance": 16
},
{
"scheme_code": 152109,
"scheme_name": "Parag Parikh Arbitrage Fund - Direct Plan Growth",
"isin": "INF879O01225",
"isin2": null,
"category_sub": "Arbitrage Fund",
"is_active": true,
"relevance": 11
},
{
"scheme_code": 152110,
"scheme_name": "Parag Parikh Arbitrage Fund - Regular Plan Growth",
"isin": "INF879O01217",
"isin2": null,
"category_sub": "Arbitrage Fund",
"is_active": true,
"relevance": 11
},
{
"scheme_code": 148958,
"scheme_name": "Parag Parikh Conservative Hybrid Fund - Direct Plan - Growth",
"isin": "INF879O01175",
"isin2": null,
...https://api.tigzig.com/mf/v1/nav?scheme=119775
{"scheme_code":119775,"scheme_name":"Kotak Midcap Fund - Direct Plan - Growth","isin":"INF174K01LT0","isin2":null,"first_available_date":"2013-01-03","latest_available_date":"2026-08-21","count":3356,"data":[{"date":"2013-01-03","nav":14.052},{"date":"2013-01-04","nav":14.177},{"date":"2013-01-07","nav":14.199},{"date":"2013-01-08","nav":14.223},{"date":"2013-01-09","nav":14.209},{"date":"2013-01-10","nav":14.122},{"date":"2013-01-11","nav":13.978},{"date":"2013-01-14","nav":14.07},{"date":"2013-01-15","nav":14.086},{"date":"2013-01-16","nav":13.972},{"date":"2013-01-17","nav":13.952},{"date":"2013-01-18","nav":13.892},{"date":"2013-01-21","nav":13.86},{"date":"2013-01-22","nav":13.805},{"date":"2013-01-23","nav":13.715},{"date":"2013-01-24","nav":13.524},{"date":"2013-01-25","nav":13.697},{"date":"2013-01-28","nav":13.633},{"date":"2013-01-29","nav":13.58},{"date":"2013-01-30","nav":13.
...