PAKDATAHUB
Docs · API reference

For AI agents: this page is available as raw Markdown at /docs/api-funds.md · every page in one file at /llms-full.txt · index at /docs/llms.txt

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.

View as Markdown (.md)