ilovepsxAPI
Build with the API / Many identities, one explicit selection

Retrieve Multiple Funds with the Pakistan Mutual Fund Bulk API

Retrieve multiple Pakistan funds using bounded bulk registry, NAV and FMR snapshot reads, with exact dates, weighted costs and explicit missing identities.

On this page

A research application often needs the same observation type for several funds. Bulk reads can reduce repeated calls, but the useful result is a selection in which every requested identity is accounted for, including funds without data for that date.

This guide distinguishes the ILovePSX registry, NAV and FMR snapshot bulk operations. It preserves exact values and period context, then demonstrates a small private collector that handles missing funds deliberately. It also explains which deeper portfolio sections still require complete report reads.

The useful part, upfront.

  • Choose registry, dated NAV or FMR snapshots as distinct operations.
  • Treat missing_funds as part of a successful result, not a zero-value row.
  • Bulk snapshots are summaries with documented expansions, not full FMR reports.

Select the operation and its weighted cost#

The bulk paths are relative to /v1/mutual-funds. POST /bulk/funds reads registry records, POST /bulk/nav reads latest or selected-date NAV and POST /bulk/snapshots reads report summaries. GET /nav/bulk is a separate dated NAV operation with repeated funds query parameters. Use funds:read, nav:read or fmr:read according to the data domain.

The current default bound is 100 funds per bulk selection, subject to runtime configuration. The weights differ: GET /nav/bulk costs two units; POST /bulk/funds costs two, POST /bulk/nav three and POST /bulk/snapshots five. Budget those units under the current 600-unit minute protection, rather than assuming 600 calls of any type. Unlimited monthly usage does not remove selection bounds or burst protection.

OperationSelectionUnits
POST /bulk/fundsfunds and optional fields2
GET /nav/bulkfunds, required date, date_policy2
POST /bulk/navfunds, optional date, date_policy3
POST /bulk/snapshotsfunds, latest/report_date, include5

References: ILovePSX public API reference · ILovePSX authentication, scopes and customer access

Use exact request bodies and do not invent bulk history#

Discover and choose canonical slugs first. For registry reads, fields projects documented public properties while id and slug remain present. Unsupported properties cause a request error rather than silently disappearing. POST operations trim and deduplicate nonblank supplied slugs before enforcing their configured limit; the client below also makes that selection explicit.

For POST /bulk/nav, omitting date requests each fund's latest accepted NAV. Supplying date requests a single date, with exact or previous_available policy. The request schema currently contains from and to fields, but the route does not implement multi-fund history from them. Use each fund's documented paginated NAV history endpoint for a time series. Never send a date range and interpret a bulk latest response as all observations in that range.

Synthetic dated-NAV request body · fictional slugs
{
  "funds": [
    "example-research-fund",
    "example-unavailable-fund"
  ],
  "date": "2026-09-30",
  "date_policy": "exact"
}

References: ILovePSX public API reference

Account for missing identities in a successful response#

The complete synthetic dated-NAV response below contains one observation and one missing identity. Its names, values and public IDs are invented. data is an array, not the history endpoint's data.navs object. The full NAV row retains price and load fields, decimal strings and nulls. meta.missing_funds explains why the selected second identity has no row.

Missing can mean an unknown identity or an identity without accepted data under the chosen date policy. Resolve that distinction through registry and coverage checks when the UI needs to explain it. Do not create a row with nav: 0, omit the missing list from your research export or call the one-row response complete coverage for every requested fund.

Complete synthetic bulk NAV response · one missing fund
{
  "success": true,
  "data": [
    {
      "fund_id": "00000000-0000-4000-8000-000000000201",
      "fund_slug": "example-research-fund",
      "fund_name": "Example Research Fund",
      "mufap_fund_id": null,
      "nav_date": "2026-09-30",
      "nav": "100.500000",
      "offer_price": "100.500000",
      "repurchase_price": "100.500000",
      "market_price": null,
      "front_end_load_pct": "0.000000",
      "back_end_load_pct": "0.000000",
      "contingent_load_pct": null,
      "nav_change_abs": null,
      "nav_change_pct": null,
      "currency": "PKR"
    }
  ],
  "meta": {
    "request_id": "synthetic-production-integration",
    "generated_at": "2026-10-09T08:00:00Z",
    "data_as_of": "2026-09-30",
    "data_freshness_days": 9,
    "missing_funds": [
      "example-unavailable-fund"
    ]
  }
}

References: ILovePSX public API reference

Collect batches while validating the complete selection#

Save the following as bulk_nav.py beside private_fund_client.py from the key-scope guide. Call collect_many with returned slugs and an ISO date. The helper uses the current default 100-fund bound; set a smaller batch size if your own job needs it. The allowlisted data client keeps the key private and distinguishes HTTP failure from a successful missing-data result.

For each batch, every requested slug must be either returned once or listed as missing. A duplicate, unexpected identity, conflicting state or incorrect exact NAV date raises an error. The collector returns its combined projection only when all batches finish. It makes no unbounded retries and does not publish a partial set as a successful completed research selection.

bulk_nav.py · exact-date batches with explicit missing identities
from datetime import date
from private_fund_client import api_json

def collect_many(slugs, requested_date, max_funds=100, read=api_json):
    if not isinstance(max_funds, int) or isinstance(max_funds, bool) or max_funds < 1:
        raise ValueError("max_funds must be a positive integer.")
    date.fromisoformat(requested_date)
    selected = list(dict.fromkeys(slug.strip() for slug in slugs if slug.strip()))
    if not selected:
        raise ValueError("Select at least one canonical fund slug.")
    collected, missing, responses = {}, [], []
    for start in range(0, len(selected), max_funds):
        batch = selected[start:start + max_funds]
        payload = read("/bulk/nav", method="POST", body={
            "funds": batch, "date": requested_date, "date_policy": "exact"})
        if payload.get("success") is not True or not isinstance(payload.get("data"), list):
            raise ValueError("Expected a successful bulk NAV array.")
        absent = payload.get("meta", {}).get("missing_funds")
        if not isinstance(absent, list) or any(not isinstance(x, str) for x in absent):
            raise ValueError("Expected an explicit missing_funds list.")
        if len(absent) != len(set(absent)) or not set(absent).issubset(batch):
            raise ValueError("Unexpected missing fund identities.")
        found = set()
        for row in payload["data"]:
            slug = row["fund_slug"]
            if slug not in batch or slug in found or slug in absent:
                raise ValueError("Unexpected or duplicated result identity.")
            if row["nav_date"] != requested_date:
                raise ValueError("An exact-date result has another source date.")
            found.add(slug)
            collected[slug] = row
        if found | set(absent) != set(batch):
            raise ValueError("The response did not account for every requested fund.")
        missing.extend(absent)
        responses.append(payload["meta"])
    return {"selection": {"funds": selected, "date": requested_date,
                           "date_policy": "exact"},
            "observations": [collected[slug] for slug in selected if slug in collected],
            "missing_funds": missing, "responses": responses}

References: ILovePSX public API reference · Python urllib.request

Keep exact and previous-available dates visible#

Use exact when a comparison requires an observation on the selected date. A missing fund remains missing for that selection. previous_available instead permits the most recent accepted observation on or before the requested date; the returned nav_date tells you which date was actually used. That policy does not mean the returned fund observations all share the requested date.

For a multi-fund latest read, each fund can also have a different source date. The envelope's data_as_of summarizes the returned set and does not replace each row's nav_date. Carry the per-fund date into charts and comparison tables. A value retrieved in October can still describe September, regardless of how recently your client called the API.

References: ILovePSX public API reference

Request report snapshots with supported expansions#

For a common report period, send latest: false and report_date with the selected funds. If latest is true, the implementation selects each fund's latest available active period and ignores the supplied report_date. The include list accepts profile, performance, allocations, holdings, fees, ratings, compliance and notes. Unsupported selectors are rejected; include=all is not the snapshot request syntax.

Snapshot output has flattened summary properties such as nav_per_unit, net_assets_pkr, benchmark and risk_profile_as_reported. The accepted profile selector does not create the complete report's nested profile object. performance expands reported_returns and metrics. allocations can include CREDIT_QUALITY rows, alongside other allocation types, although there is no separate credit_quality selector. The snapshot does not attach per-row report_id or page_number, section-state metadata or the full report source array; use a complete FMR read with include=all for that richer context.

Synthetic same-period snapshot request · supported selectors
{
  "funds": [
    "example-research-fund",
    "example-unavailable-fund"
  ],
  "latest": false,
  "report_date": "2026-09-30",
  "include": [
    "performance",
    "allocations",
    "holdings"
  ]
}

References: ILovePSX public API reference

Inspect the complete expanded snapshot model#

This complete synthetic snapshot response includes summary context, reported performance, metrics, allocations and holdings for one fictional fund. It keeps top-level report_ids and report_date, but its child rows contain only the public model columns, without the per-row report link and page number added by complete-report reads. The three top holdings total 38% of total assets; they are disclosed top holdings, not a claim that the entire portfolio consists of three securities.

Allocations and holdings retain their stated denominators, while the parent snapshot supplies their monthly report period. This model's allocations include CREDIT_QUALITY buckets; inspect allocation_type before building a separate composition view. The complete report adds detailed profile, parties, section states and source provenance rather than uniquely making credit-quality facts available. Missing fund identities remain in metadata even when the available fund has richly expanded sections. A successful bulk summary should not be labelled universal report coverage.

Complete synthetic bulk FMR snapshot · expanded report sections
{
  "success": true,
  "data": [
    {
      "fund": {
        "id": "00000000-0000-4000-8000-000000000201",
        "slug": "example-research-fund",
        "name": "Example Research Fund"
      },
      "report_ids": [
        "00000000-0000-4000-8000-000000000101"
      ],
      "report_date": "2026-09-30",
      "data_version": 1,
      "currency": "PKR",
      "nav_per_unit": "100.500000",
      "net_assets_pkr": "1005000000.0000",
      "fund_size_pkr": "1005000000.0000",
      "units_outstanding": "10000000.000000",
      "benchmark": "Example composite benchmark",
      "risk_profile_as_reported": "Illustrative higher-risk profile",
      "reported_returns": [
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 1,
          "period_label_raw": "1 year",
          "period_key": "1Y",
          "fund_return_percent": "12.00000000",
          "benchmark_return_percent": "10.00000000",
          "peer_return_percent": null,
          "return_type": "ABSOLUTE",
          "is_annualized": false,
          "is_since_inception": false,
          "calculation_basis_raw": "Synthetic cumulative return for the stated period"
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 2,
          "period_label_raw": "Month to date",
          "period_key": "MTD",
          "fund_return_percent": "0.50000000",
          "benchmark_return_percent": "0.40000000",
          "peer_return_percent": null,
          "return_type": "ABSOLUTE",
          "is_annualized": false,
          "is_since_inception": false,
          "calculation_basis_raw": "Synthetic cumulative September return"
        }
      ],
      "metrics": [
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 1,
          "metric_key": "NUMBER_OF_HOLDINGS",
          "label_raw": "Illustrative number of equity holdings",
          "value": "12.00000000",
          "unit": "count",
          "period": "September 2026",
          "benchmark_value": null
        }
      ],
      "allocations": [
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 1,
          "allocation_type": "ASSET_ALLOCATION",
          "label_raw": "Equities",
          "label_normalized": null,
          "percent_of_total_assets": "60.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": "603000000.0000",
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 2,
          "allocation_type": "ASSET_ALLOCATION",
          "label_raw": "Cash",
          "label_normalized": null,
          "percent_of_total_assets": "20.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": "201000000.0000",
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 3,
          "allocation_type": "ASSET_ALLOCATION",
          "label_raw": "Government securities",
          "label_normalized": null,
          "percent_of_total_assets": "15.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": "150750000.0000",
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 4,
          "allocation_type": "ASSET_ALLOCATION",
          "label_raw": "Other assets",
          "label_normalized": null,
          "percent_of_total_assets": "5.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": "50250000.0000",
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 5,
          "allocation_type": "SECTOR_ALLOCATION",
          "label_raw": "Technology",
          "label_normalized": null,
          "percent_of_total_assets": "25.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": "251250000.0000",
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 6,
          "allocation_type": "SECTOR_ALLOCATION",
          "label_raw": "Fertilizer",
          "label_normalized": null,
          "percent_of_total_assets": "20.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": "201000000.0000",
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 7,
          "allocation_type": "SECTOR_ALLOCATION",
          "label_raw": "Banks",
          "label_normalized": null,
          "percent_of_total_assets": "15.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": "150750000.0000",
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 8,
          "allocation_type": "CREDIT_QUALITY",
          "label_raw": "Government securities — illustrative bucket",
          "label_normalized": null,
          "percent_of_total_assets": "15.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": null,
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 9,
          "allocation_type": "CREDIT_QUALITY",
          "label_raw": "Unrated / no rating assigned in this example",
          "label_normalized": null,
          "percent_of_total_assets": "85.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "amount": null,
          "current_period": null,
          "previous_period": null,
          "change_percent": null,
          "bucket_start_days": null,
          "bucket_end_days": null,
          "bucket_start_years": null,
          "bucket_end_years": null
        }
      ],
      "holdings": [
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 1,
          "holding_group": "TOP_HOLDINGS",
          "rank": 1,
          "name_raw": "Example Technology Company",
          "holding_type": "EQUITY",
          "asset_class": "Equities",
          "issuer_name_raw": "Example Technology Company",
          "security_name_raw": "Example Technology Company ordinary shares",
          "symbol_raw": "EXTECH",
          "sector_raw": "Technology",
          "percent_of_total_assets": "18.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "percent_held": null,
          "market_value": "180900000.0000",
          "value_before_provisioning": null,
          "provisioning_amount": null,
          "value_after_provisioning": null,
          "quantity": "1000000.000000",
          "units": "shares",
          "credit_rating": null,
          "rating_agency": null,
          "instrument_type_raw": "Ordinary shares",
          "coupon_rate": null,
          "yield_percent": null,
          "ytm_percent": null,
          "issue_date": null,
          "maturity_date": null,
          "listed_or_unlisted": "Listed — illustrative",
          "secured_or_unsecured": null,
          "is_shariah_compliant": null,
          "is_top_holding": true,
          "is_non_compliant": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 2,
          "holding_group": "TOP_HOLDINGS",
          "rank": 2,
          "name_raw": "Example Fertilizer Company",
          "holding_type": "EQUITY",
          "asset_class": "Equities",
          "issuer_name_raw": "Example Fertilizer Company",
          "security_name_raw": "Example Fertilizer Company ordinary shares",
          "symbol_raw": "EXFERT",
          "sector_raw": "Fertilizer",
          "percent_of_total_assets": "12.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "percent_held": null,
          "market_value": "120600000.0000",
          "value_before_provisioning": null,
          "provisioning_amount": null,
          "value_after_provisioning": null,
          "quantity": "800000.000000",
          "units": "shares",
          "credit_rating": null,
          "rating_agency": null,
          "instrument_type_raw": "Ordinary shares",
          "coupon_rate": null,
          "yield_percent": null,
          "ytm_percent": null,
          "issue_date": null,
          "maturity_date": null,
          "listed_or_unlisted": "Listed — illustrative",
          "secured_or_unsecured": null,
          "is_shariah_compliant": null,
          "is_top_holding": true,
          "is_non_compliant": null
        },
        {
          "sub_fund_key": null,
          "sub_fund_name_raw": null,
          "row_order": 3,
          "holding_group": "TOP_HOLDINGS",
          "rank": 3,
          "name_raw": "Example Banking Company",
          "holding_type": "EQUITY",
          "asset_class": "Equities",
          "issuer_name_raw": "Example Banking Company",
          "security_name_raw": "Example Banking Company ordinary shares",
          "symbol_raw": "EXBANK",
          "sector_raw": "Banks",
          "percent_of_total_assets": "8.000000",
          "percent_of_net_assets": null,
          "percent_of_gross_assets": null,
          "percent_held": null,
          "market_value": "80400000.0000",
          "value_before_provisioning": null,
          "provisioning_amount": null,
          "value_after_provisioning": null,
          "quantity": "500000.000000",
          "units": "shares",
          "credit_rating": null,
          "rating_agency": null,
          "instrument_type_raw": "Ordinary shares",
          "coupon_rate": null,
          "yield_percent": null,
          "ytm_percent": null,
          "issue_date": null,
          "maturity_date": null,
          "listed_or_unlisted": "Listed — illustrative",
          "secured_or_unsecured": null,
          "is_shariah_compliant": null,
          "is_top_holding": true,
          "is_non_compliant": null
        }
      ]
    }
  ],
  "meta": {
    "request_id": "synthetic-production-integration",
    "generated_at": "2026-10-09T08:00:00Z",
    "data_as_of": "2026-09-30",
    "data_freshness_days": 9,
    "missing_funds": [
      "example-unavailable-fund"
    ]
  }
}
Synthetic report facts

Every fund, issuer, observation and financial value in this model is fictional. Empty or null fields remain explicit, and no real source report is asserted.

References: ILovePSX public API reference

Design three separate application states#

Show an available observation with its date and exact value; show a selected missing identity with an explanation of the chosen policy; show a failed request as an operation failure. A 422 invalidates the request selection, a 401 or 403 requires access review and a 429 requires bounded deferral. None of those errors should become an apparently valid missing_funds response.

Preserve the original ordered selection, per-batch metadata and each report's version when exporting the completed projection. Reconcile later corrections through the same identities and periods. Bulk reads give a research UI an efficient base for richer profile, performance and portfolio views when the selection and its limits remain visible to the reader.

References: ILovePSX public API reference · ILovePSX authentication, scopes and customer access

MOCK DATA / REAL RESPONSE STRUCTURE

Try a complete example.

Use these fictional records to prototype a full fund view: profile, reported returns, holdings, asset and sector allocations, credit quality, fees and ratings. Every name, identifier and number is invented. This is educational mock data, with no connection to a real fund, source document or agency opinion.

The JSON mirrors the public response structure. The complete FMR example includes all supported expansions; empty arrays and nulls demonstrate valid missing-data states. Your live integration must still request the sections it needs and check the returned coverage.

Inspect the complete FMR model
Complete synthetic FMR response · fictional data
{
  "success": true,
  "data": {
    "id": "00000000-0000-4000-8000-000000000101",
    "report_ids": [
      "00000000-0000-4000-8000-000000000101"
    ],
    "fund": {
      "id": "00000000-0000-4000-8000-000000000201",
      "slug": "example-research-fund",
      "name": "Example Research Fund",
      "mufap_fund_id": null,
      "amc": {
        "id": "00000000-0000-4000-8000-000000000301",
        "slug": "example-asset-management",
        "name": "Example Asset Management"
      }
    },
    "report_date": "2026-09-30",
    "currency": "PKR",
    "data_version": 1,
    "identity": {
      "fund_name_as_reported": "Example Research Fund",
      "fund_short_name_as_reported": "ERF",
      "parent_fund_name_as_reported": null,
      "plan_name_as_reported": null,
      "fund_type_as_reported": "Open-end",
      "category_as_reported": "Illustrative mixed-asset category",
      "risk_profile_as_reported": "Illustrative higher-risk profile",
      "is_shariah_compliant": false,
      "is_plan": false,
      "is_pension_scheme": false,
      "is_etf": false
    },
    "fund_size": {
      "nav_per_unit": "100.500000",
      "nav_date": "2026-09-30",
      "offer_price": "100.500000",
      "redemption_price": "100.500000",
      "repurchase_price": "100.500000",
      "market_price": null,
      "net_assets_pkr": "1005000000.0000",
      "fund_size_pkr": "1005000000.0000",
      "fund_size_including_fof_pkr": "1005000000.0000",
      "fund_size_excluding_fof_pkr": "1005000000.0000",
      "amount_invested_by_fof_pkr": "0.0000",
      "units_outstanding": "10000000.000000"
    },
    "profile": {
      "launch_date": "2025-01-01",
      "inception_date": "2025-01-01",
      "maturity_date": null,
      "benchmark": "Example composite benchmark",
      "old_benchmark": null,
      "new_benchmark": null,
      "benchmark_effective_date": null,
      "risk_of_principal_erosion": "Principal may fluctuate; synthetic disclosure.",
      "pricing_mechanism": "Forward pricing — illustrative",
      "dealing_days": "Monday to Friday — illustrative",
      "dealing_time": "09:00 to 14:00 Pakistan time — illustrative",
      "cutoff_time": "14:00 Pakistan time — illustrative",
      "settlement_period": "T+2 — illustrative, not an actual dealing policy",
      "minimum_initial_investment_pkr": "5000.0000",
      "minimum_subsequent_investment_pkr": "1000.0000",
      "minimum_redemption_pkr": "1000.0000",
      "unit_classes": [
        "Illustrative standard units"
      ],
      "leverage": "None in this synthetic example"
    },
    "report_fragments": [
      {
        "id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "schema_version": "fmr_page_v3",
        "data_version": 1,
        "promoted_at": "2026-10-08T08:00:00Z",
        "report_date": "2026-09-30",
        "report_month": "September 2026",
        "page_type": "FUND_REPORT",
        "extraction_mode": "PROFILE_PERFORMANCE_PORTFOLIO",
        "amc_name_raw": "Example Asset Management",
        "fund_name_raw": "Example Research Fund",
        "fund_short_name_raw": "ERF",
        "parent_fund_name_raw": null,
        "plan_name_raw": null,
        "fund_type_raw": "Open-end",
        "category_raw": "Illustrative mixed-asset category",
        "risk_profile_raw": "Illustrative higher-risk profile",
        "risk_of_principal_erosion_raw": "Principal may fluctuate; synthetic disclosure.",
        "is_shariah_compliant": false,
        "is_plan": false,
        "is_pension_scheme": false,
        "is_etf": false,
        "launch_date": "2025-01-01",
        "inception_date": "2025-01-01",
        "maturity_date": null,
        "benchmark_raw": "Example composite benchmark",
        "old_benchmark_raw": null,
        "new_benchmark_raw": null,
        "benchmark_effective_date": null,
        "par_value": "100.000000",
        "listing_raw": null,
        "leverage_raw": "None in this synthetic example",
        "nav_per_unit": "100.500000",
        "nav_date": "2026-09-30",
        "offer_price": "100.500000",
        "redemption_price": "100.500000",
        "repurchase_price": "100.500000",
        "market_price": null,
        "net_assets": "1005000000.0000",
        "fund_size": "1005000000.0000",
        "fund_size_including_fof": "1005000000.0000",
        "fund_size_excluding_fof": "1005000000.0000",
        "amount_invested_by_fof": "0.0000",
        "units_outstanding": "10000000.000000",
        "currency": "PKR",
        "pricing_mechanism_raw": "Forward pricing — illustrative",
        "dealing_days_raw": "Monday to Friday — illustrative",
        "dealing_time_raw": "09:00 to 14:00 Pakistan time — illustrative",
        "cutoff_time_raw": "14:00 Pakistan time — illustrative",
        "settlement_period_raw": "T+2 — illustrative, not an actual dealing policy",
        "minimum_initial_investment": "5000.0000",
        "minimum_subsequent_investment": "1000.0000",
        "minimum_redemption": "1000.0000",
        "unit_classes": [
          "Illustrative standard units"
        ]
      }
    ],
    "sub_funds": [],
    "reported_returns": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "period_label_raw": "1 year",
        "period_key": "1Y",
        "fund_return_percent": "12.00000000",
        "benchmark_return_percent": "10.00000000",
        "peer_return_percent": null,
        "return_type": "ABSOLUTE",
        "is_annualized": false,
        "is_since_inception": false,
        "calculation_basis_raw": "Synthetic cumulative return for the stated period"
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 2,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "period_label_raw": "Month to date",
        "period_key": "MTD",
        "fund_return_percent": "0.50000000",
        "benchmark_return_percent": "0.40000000",
        "peer_return_percent": null,
        "return_type": "ABSOLUTE",
        "is_annualized": false,
        "is_since_inception": false,
        "calculation_basis_raw": "Synthetic cumulative September return"
      }
    ],
    "allocations": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "ASSET_ALLOCATION",
        "label_raw": "Equities",
        "label_normalized": null,
        "percent_of_total_assets": "60.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": "603000000.0000",
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 2,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "ASSET_ALLOCATION",
        "label_raw": "Cash",
        "label_normalized": null,
        "percent_of_total_assets": "20.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": "201000000.0000",
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 3,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "ASSET_ALLOCATION",
        "label_raw": "Government securities",
        "label_normalized": null,
        "percent_of_total_assets": "15.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": "150750000.0000",
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 4,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "ASSET_ALLOCATION",
        "label_raw": "Other assets",
        "label_normalized": null,
        "percent_of_total_assets": "5.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": "50250000.0000",
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 5,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "SECTOR_ALLOCATION",
        "label_raw": "Technology",
        "label_normalized": null,
        "percent_of_total_assets": "25.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": "251250000.0000",
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 6,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "SECTOR_ALLOCATION",
        "label_raw": "Fertilizer",
        "label_normalized": null,
        "percent_of_total_assets": "20.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": "201000000.0000",
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 7,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "SECTOR_ALLOCATION",
        "label_raw": "Banks",
        "label_normalized": null,
        "percent_of_total_assets": "15.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": "150750000.0000",
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 8,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "CREDIT_QUALITY",
        "label_raw": "Government securities — illustrative bucket",
        "label_normalized": null,
        "percent_of_total_assets": "15.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": null,
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 9,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "allocation_type": "CREDIT_QUALITY",
        "label_raw": "Unrated / no rating assigned in this example",
        "label_normalized": null,
        "percent_of_total_assets": "85.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "amount": null,
        "current_period": null,
        "previous_period": null,
        "change_percent": null,
        "bucket_start_days": null,
        "bucket_end_days": null,
        "bucket_start_years": null,
        "bucket_end_years": null
      }
    ],
    "holdings": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "holding_group": "TOP_HOLDINGS",
        "rank": 1,
        "name_raw": "Example Technology Company",
        "holding_type": "EQUITY",
        "asset_class": "Equities",
        "issuer_name_raw": "Example Technology Company",
        "security_name_raw": "Example Technology Company ordinary shares",
        "symbol_raw": "EXTECH",
        "sector_raw": "Technology",
        "percent_of_total_assets": "18.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "percent_held": null,
        "market_value": "180900000.0000",
        "value_before_provisioning": null,
        "provisioning_amount": null,
        "value_after_provisioning": null,
        "quantity": "1000000.000000",
        "units": "shares",
        "credit_rating": null,
        "rating_agency": null,
        "instrument_type_raw": "Ordinary shares",
        "coupon_rate": null,
        "yield_percent": null,
        "ytm_percent": null,
        "issue_date": null,
        "maturity_date": null,
        "listed_or_unlisted": "Listed — illustrative",
        "secured_or_unsecured": null,
        "is_shariah_compliant": null,
        "is_top_holding": true,
        "is_non_compliant": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 2,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "holding_group": "TOP_HOLDINGS",
        "rank": 2,
        "name_raw": "Example Fertilizer Company",
        "holding_type": "EQUITY",
        "asset_class": "Equities",
        "issuer_name_raw": "Example Fertilizer Company",
        "security_name_raw": "Example Fertilizer Company ordinary shares",
        "symbol_raw": "EXFERT",
        "sector_raw": "Fertilizer",
        "percent_of_total_assets": "12.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "percent_held": null,
        "market_value": "120600000.0000",
        "value_before_provisioning": null,
        "provisioning_amount": null,
        "value_after_provisioning": null,
        "quantity": "800000.000000",
        "units": "shares",
        "credit_rating": null,
        "rating_agency": null,
        "instrument_type_raw": "Ordinary shares",
        "coupon_rate": null,
        "yield_percent": null,
        "ytm_percent": null,
        "issue_date": null,
        "maturity_date": null,
        "listed_or_unlisted": "Listed — illustrative",
        "secured_or_unsecured": null,
        "is_shariah_compliant": null,
        "is_top_holding": true,
        "is_non_compliant": null
      },
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 3,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "holding_group": "TOP_HOLDINGS",
        "rank": 3,
        "name_raw": "Example Banking Company",
        "holding_type": "EQUITY",
        "asset_class": "Equities",
        "issuer_name_raw": "Example Banking Company",
        "security_name_raw": "Example Banking Company ordinary shares",
        "symbol_raw": "EXBANK",
        "sector_raw": "Banks",
        "percent_of_total_assets": "8.000000",
        "percent_of_net_assets": null,
        "percent_of_gross_assets": null,
        "percent_held": null,
        "market_value": "80400000.0000",
        "value_before_provisioning": null,
        "provisioning_amount": null,
        "value_after_provisioning": null,
        "quantity": "500000.000000",
        "units": "shares",
        "credit_rating": null,
        "rating_agency": null,
        "instrument_type_raw": "Ordinary shares",
        "coupon_rate": null,
        "yield_percent": null,
        "ytm_percent": null,
        "issue_date": null,
        "maturity_date": null,
        "listed_or_unlisted": "Listed — illustrative",
        "secured_or_unsecured": null,
        "is_shariah_compliant": null,
        "is_top_holding": true,
        "is_non_compliant": null
      }
    ],
    "metrics": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "metric_key": "NUMBER_OF_HOLDINGS",
        "label_raw": "Illustrative number of equity holdings",
        "value": "12.00000000",
        "unit": "count",
        "period": "September 2026",
        "benchmark_value": null
      }
    ],
    "fees": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "fee_type": "TOTAL_EXPENSE_RATIO",
        "label_raw": "Illustrative annualized total expense ratio",
        "value_percent": "2.000000",
        "value_amount": null,
        "currency": "PKR",
        "period": "September 2026 — annualized illustration",
        "with_government_levies": true,
        "government_levy_percent": null,
        "secp_fee_percent": null,
        "is_actual_charged": true,
        "is_maximum_allowed": false
      }
    ],
    "ratings": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "rating_type": "ILLUSTRATIVE",
        "rating_raw": "Illustrative rating — not an agency opinion",
        "rating_agency": "Example agency (fictional)",
        "rating_date": null,
        "outlook_raw": null
      }
    ],
    "parties": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "role": "FUND_MANAGER",
        "name_raw": "Example Research Team",
        "designation_raw": "Illustrative fund-management team",
        "organization_raw": "Example Asset Management"
      }
    ],
    "special_terms": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "term_type": "INVESTMENT_OBJECTIVE",
        "label_raw": "Illustrative investment objective",
        "value_raw": "A fictional mixed-asset portfolio used only to demonstrate the response model.",
        "value_numeric": null,
        "value_percent": null,
        "value_amount": null,
        "value_date": null,
        "currency": "PKR"
      }
    ],
    "compliance": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "compliance_type": "ILLUSTRATIVE_DISCLOSURE",
        "name_raw": "Synthetic compliance disclosure",
        "limit_type_raw": null,
        "regulatory_limit_percent": null,
        "actual_exposure_percent": null,
        "excess_percent": null,
        "gross_assets_percent": null,
        "net_assets_percent": null,
        "status_raw": "Illustrative only — no regulatory assessment has been performed"
      }
    ],
    "notes": [
      {
        "sub_fund_key": null,
        "sub_fund_name_raw": null,
        "row_order": 1,
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "note_kind": "NOTE",
        "section_type": "PORTFOLIO",
        "note_type": "ILLUSTRATIVE",
        "text": "All figures and entities are synthetic. The three reported top holdings are a partial list. Sector percentages use total assets. Credit-quality labels and rating text are not agency opinions."
      }
    ],
    "source": [
      {
        "report_id": "00000000-0000-4000-8000-000000000101",
        "page_number": 1,
        "document": null,
        "promoted_at": "2026-10-08T08:00:00Z",
        "data_version": 1
      }
    ],
    "sections": {
      "sub_funds": {
        "status": "NOT_REPORTED",
        "row_count": 0
      },
      "reported_returns": {
        "status": "AVAILABLE",
        "row_count": 2
      },
      "allocations": {
        "status": "AVAILABLE",
        "row_count": 9
      },
      "holdings": {
        "status": "AVAILABLE",
        "row_count": 3
      },
      "metrics": {
        "status": "AVAILABLE",
        "row_count": 1
      },
      "fees": {
        "status": "AVAILABLE",
        "row_count": 1
      },
      "ratings": {
        "status": "AVAILABLE",
        "row_count": 1
      },
      "parties": {
        "status": "AVAILABLE",
        "row_count": 1
      },
      "special_terms": {
        "status": "AVAILABLE",
        "row_count": 1
      },
      "compliance": {
        "status": "AVAILABLE",
        "row_count": 1
      },
      "notes": {
        "status": "AVAILABLE",
        "row_count": 1
      },
      "source": {
        "status": "AVAILABLE",
        "row_count": 1
      }
    },
    "available_expansions": [
      "allocations",
      "compliance",
      "fees",
      "holdings",
      "metrics",
      "notes",
      "parties",
      "ratings",
      "reported_returns",
      "source",
      "special_terms",
      "sub_funds"
    ]
  },
  "meta": {
    "request_id": "00000000000040008000000000000401",
    "generated_at": "2026-10-08T08:00:00Z",
    "data_as_of": "2026-09-30",
    "data_freshness_days": 8
  }
}
Inspect the latest NAV model
Synthetic latest NAV response · fictional data
{
  "success": true,
  "data": [
    {
      "fund_id": "00000000-0000-4000-8000-000000000201",
      "fund_slug": "example-research-fund",
      "fund_name": "Example Research Fund",
      "mufap_fund_id": null,
      "nav_date": "2026-09-30",
      "nav": "100.500000",
      "offer_price": "100.500000",
      "repurchase_price": "100.500000",
      "market_price": null,
      "front_end_load_pct": "0.000000",
      "back_end_load_pct": "0.000000",
      "contingent_load_pct": null,
      "nav_change_abs": null,
      "nav_change_pct": null,
      "currency": "PKR"
    }
  ],
  "meta": {
    "request_id": "00000000000040008000000000000402",
    "generated_at": "2026-10-08T08:00:00Z",
    "data_as_of": "2026-09-30",
    "data_freshness_days": 8
  }
}
TRACE THE EVIDENCE

Sources & further reading

Check the published contract for current fields and limits. Source documents describe reported facts; API availability still depends on promoted production coverage.

  1. ILovePSX public API reference
  2. ILovePSX authentication, scopes and customer access
  3. Python urllib.request

Put the guide to work.

Start with the documented contract, keep your key server-side, and make dates and missing data visible in your product.

Review bulk request and response contracts