Mutual funds
Every open-end and pension fund reported by the Mutual Funds Association of Pakistan (MUFAP), 567 funds from 25 asset managers. The data covers daily NAVs back to 1996, trailing returns, dividend payouts, expense ratios (TER) and monthly asset allocation. Funds are identified by MUFAP's numeric fund_id.
GET /v1/funds 🔑
List and search funds.
| Param | Type | Notes |
|---|---|---|
amc |
string | Asset-manager filter, partial match (e.g. Meezan, ABL) |
category |
string | e.g. Money Market, Equity, Shariah Compliant Income |
sector |
string | e.g. Open-End Funds |
q |
string | Fund-name filter |
limit |
int | Default 1000 |
curl -H "X-API-Key: pk_live_xxx" "https://api.pakdatahub.com/v1/funds?amc=Meezan&limit=2"
{ "success": true, "count": 2, "data": [
{ "fund_id": 12821, "name": "Al Meezan Mutual Fund", "amc": "Al Meezan Investment Management Limited",
"sector": "Open-End Funds", "category": "Shariah Compliant Equity",
"inception_date": "1995-07-13", "trustee": "CDC",
"latest_nav": { "date": "2026-09-17", "nav": 48.071, "offer": 49.1766, "repurchase": 48.071 } },
{ "fund_id": 12826, "name": "KSE Meezan Index Fund", "...": "..." }
] }
GET /v1/funds/screener 🔑
Every active fund in one response, with the fields a screener ranks on. Use it instead of calling /returns and /expenses once per fund. It's cached for about an hour.
{ "success": true, "count": 588, "data": [
{ "fund_id": 14750, "name": "786 Islamic Money Market Fund", "amc": "786 Investments Limited",
"category": "Shariah Compliant Money Market", "sector": "Open-End Funds",
"rating": null, "benchmark": "N/A",
"nav": { "date": "2026-09-18", "value": 102.7144 },
"returns": { "as_of": "2026-09-23", "ytd": 9.84, "m3": 9.94, "y1": 9.83 },
"ter_ytd": 0.79, "ter_as_of": "2026-09-18" }
] }
returns are MUFAP's reported trailing returns in % (m3 = 90 days, y1 = 365 days, ytd = fiscal year to date, where Pakistan's fiscal year starts 1 July). ter_ytd is the total expense ratio in %. The free fund screener tool is built on this endpoint.
GET /v1/funds/{fund_id} 🔑
Profile plus latest NAV:
{ "success": true,
"fund": { "fund_id": 12843, "name": "Meezan Asset Allocation Fund", "amc": "Al Meezan Investment Management Limited",
"sector": "Open-End Funds", "category": "Shariah Compliant Asset Allocation",
"inception_date": "2016-04-18", "trustee": "CDC" },
"latest_nav": { "date": "2026-09-18", "nav": 113.0185, "offer": 116.9176, "repurchase": 113.0185 } }
GET /v1/funds/{fund_id}/nav 🔑
Daily NAV history. Params: from, to, limit (default 1000), sort.
{ "success": true, "fund_id": 12843, "count": 2, "data": [
{ "date": "2026-09-18", "nav": 113.0185, "offer": 116.9176, "repurchase": 113.0185 },
{ "date": "2026-09-17", "nav": 112.1417, "offer": 116.0105, "repurchase": 112.1417 } ] }
Historical points before a fund's daily snapshots began carry nav only. Free and Developer plans are clamped to their history window.
GET /v1/funds/{fund_id}/returns 🔑
MUFAP trailing returns, in %, as published each day. Params: from, to, limit, sort.
{ "success": true, "fund_id": 12843, "count": 1, "data": [
{ "date": "2026-09-23", "rating": null, "benchmark": "N/A",
"ytd": null, "mtd": null, "d1": 0.72, "d15": null, "d30": null,
"d90": null, "d180": 11.14, "d270": null, "d365": 0.17 } ] }
dN = N-day return. A null means MUFAP didn't publish that period.
Annualized for fixed-income funds: following MUFAP's convention, returns for money-market, income, fixed-rate and other debt funds are annualized, while equity-type funds report plain period returns. A one-day return (d1) annualized can therefore look extreme, e.g. 100%+ after a sharp daily NAV move. To compare funds, use longer windows (d90, d365), or /analytics for returns computed from the full NAV history (3y, 5y, CAGR, volatility, drawdown).
GET /v1/funds/{fund_id}/payouts 🔑
Dividend and payout history, back to about 2010. Param: limit.
{ "success": true, "fund_id": 12843, "count": 2, "data": [
{ "payout_date": "2025-06-27", "per_unit": 1.0, "ex_nav": 93.1809 },
{ "payout_date": "2024-06-28", "per_unit": 3.25, "ex_nav": 60.7337 } ] }
Daily-dividend money-market funds have thousands of records.
GET /v1/funds/{fund_id}/expenses 🔑
Expense ratios over time, in %. Param: limit.
{ "success": true, "fund_id": 12843, "count": 1, "data": [
{ "date": "2026-09-18", "ter_mtd": 4.87, "ter_ytd": 4.87, "management_fee": 3.0, "selling_marketing": 0.0 } ] }
GET /v1/funds/{fund_id}/portfolio 🔑
The latest monthly asset allocation, as a % of net assets:
{ "success": true, "fund_id": 12843, "as_of": "2026-08-01", "count": 4, "data": [
{ "asset_class": "Equities", "percent": 89.96 },
{ "asset_class": "Cash", "percent": 10.23 },
{ "asset_class": "Other & receivables", "percent": 0.69 },
{ "asset_class": "Liabilities", "percent": -0.88 } ] }
Allocations sum to about 100%. A negative Liabilities line is normal: it reconciles gross holdings to net assets. The asset classes include Cash, Equities, T-Bills, PIBs, GoP Ijara Sukuk, TFCs/Sukuk, placements, Commodity/Gold and others.
Recipes
import httpx, pandas as pd
H = {"X-API-Key": "pk_live_xxx"}
B = "https://api.pakdatahub.com/v1/funds"
# Top 10 money-market funds by 1-year return, from one call
s = pd.json_normalize(httpx.get(f"{B}/screener", headers=H).json()["data"])
mm = s[s["category"].str.contains("Money Market")]
print(mm.sort_values("returns.y1", ascending=False).head(10)[["name", "amc", "returns.y1", "ter_ytd"]])
# Full NAV history of one fund
nav = pd.DataFrame(httpx.get(f"{B}/12843/nav", params={"sort": "asc", "limit": 10000}, headers=H).json()["data"])
Related: Fund analytics · AMCs · Mutual funds dataset.