On this page
A fund family, an investment plan, a unit type and a report-scoped sub-fund can appear beside similar labels while representing different concepts. Flattening them into one name field produces fragile joins and confusing research pages. The error becomes harder to notice when a polished interface shows a complete profile and portfolio for the wrong record.
This guide maps those concepts to the fields the ILovePSX public API actually provides. It uses fictional examples to show the model and its limits. The service does not promise an exhaustive share-class graph or a separate tradable series for every unit label; preserve reported class information without turning it into an unsupported registry relationship.
The useful part, upfront.
- Use canonical fund IDs and returned slugs for API-facing fund identity.
- Keep family and plan context separate from reported unit-class labels.
- Report-scoped sub-fund UUIDs and keys are not canonical registry fund identifiers.
Give each concept its own place in the model#
The registry resource describes a canonical fund with id, slug and official_name. Its optional family object supplies grouping identity, while plan_name supplies plan context where available. The complete FMR separately includes identity.plan_name_as_reported, parent_fund_name_as_reported and related reported labels. These are source-aware representations, not interchangeable keys.
Unit types and classes need their own documented meaning. Meezan Islamic Fund's offering document discusses unit types and classes within the fund's governing terms. That primary example demonstrates why a unit label should retain its source context; it is not a universal definition of class letters across Pakistani funds. Review the applicable current offering and supplemental documents before assigning a class a fee or distribution behaviour.
References: ILovePSX public API reference · Al Meezan: Meezan Islamic Fund consolidated offering document
Use available fields without inventing a class graph#
The registry exposes family, plan_name, scheme_type, category, vps_sub_allocation and lifecycle_status alongside identity. The complete report exposes profile.unit_classes as a nullable list of reported class information. The list is not a documented class-ID catalog, class-level price endpoint or fully normalized hierarchy. Preserve its returned shape rather than assigning fictitious canonical class UUIDs.
The service's fund-level NAV operation uses a registry fund slug. Do not synthesize a new slug by appending a unit label, and do not assume a fee row applies to every possible class because it shares a fund name. Where the available source record does not resolve class-specific terms, show that limitation. A faithful incomplete relationship is more useful than a neat graph built from guessed naming conventions.
| Concept | Published context | Safe use |
|---|---|---|
| Canonical fund | Registry id, slug, official_name | Fund lookup and research joins |
| Family | Registry family object | Grouping related returned records |
| Plan | Registry plan_name; FMR reported plan label | Preserve distinct canonical and reported context |
| Unit/class information | FMR profile.unit_classes | Display reported information without invented IDs |
| Report sub-fund | sub_funds[].id, report_id, sub_fund_key | Scoped ownership inside the reported record |
References: ILovePSX public API reference
A rich fictional identity example with explicit limits#
The selected fields below describe one invented plan record inside Example Research Family. The registry plan label and the report's printed plan label differ slightly. Its unit_classes list contains two fictional display labels, not defined official classes or separate API identities. The schema shape is a teaching subset; no real fund, production response or source document is represented.
Keep both plan labels: the canonical registry context supports stable discovery, and the source-reported label preserves what the report called the plan. The unit-class list remains attributed to this report period. A change to those labels in a later report does not automatically create or remove a canonical fund, and it does not establish a change to NAV methodology or fee entitlements without supporting evidence.
{
"registry": {
"id": "00000000-0000-4000-8000-000000000701",
"slug": "example-research-plan-one",
"official_name": "Example Research Plan One",
"plan_name": "Example Plan One",
"family": {
"id": "00000000-0000-4000-8000-000000000702",
"slug": "example-research-family",
"name": "Example Research Family",
"type": "MULTI_PLAN_FOF"
}
},
"report": {
"report_date": "2026-09-30",
"identity": {
"fund_name_as_reported": "Example Research Plan 1",
"parent_fund_name_as_reported": "Example Research Family",
"plan_name_as_reported": "Example Plan 1",
"is_plan": true
},
"profile": {
"unit_classes": ["Example Growth Label", "Example Income Label"]
}
}
}Resolve similar names before retrieving facts#
Search the registry and present official_name with AMC and optional family or plan context. If more than one result is plausible, ask the user to select the actual returned record. Avoid removing plan numbers, parenthetical labels or sub-allocation words before joining names: those apparently cosmetic parts can distinguish records that need different NAV histories and report facts.
For historical research, preserve lifecycle context and identity dates rather than selecting only the most familiar active name. A similar current product does not prove continuity with an older record. Keep aliases and display labels in your application separate from the public ID used for stored joins. A source-name difference should trigger deliberate comparison, not an automatic merge that transfers one plan's portfolio into another.
References: ILovePSX public API reference
Scope report sub-funds to their report fragments#
A complete FMR's sub_funds array can describe components within the promoted report. Each sub-fund row has its own public id and carries report_id, page_number, sub_fund_key and sub_fund_name_raw. Other section rows can carry the same report and sub-fund key context. That public sub-fund UUID identifies a report-scoped record, not the registry fund that should be supplied in a /funds/{fund_slug} path.
The current public child rows do not expose a sub_fund_id link to those UUIDs. Use the available report_id and sub_fund_key context for scoped association, and retain missing or ambiguous states. Repeating a key such as EQUITY across two report fragments is not a global identity match. A canonical registry mapping requires additional supported identity evidence rather than a convenient equality between display labels.
References: ILovePSX public API reference · Structured Fund Manager Reports API
Normalize an identity view while preserving the boundaries#
The Python function below assembles a small application identity view from a canonical registry record and its complete report. It first checks that the report's fund.id matches the registry id. It keeps registry and reported plan labels separate and retains profile.unit_classes without inventing per-class identities. The resulting keys belong to the application, not to a new API endpoint.
For report sub-funds, retain the public sub-fund id together with its report_id and key. A null unit-class list stays null rather than turning into a claim that the fund has no unit types. This small normalization boundary makes display and export code simpler while avoiding the common shortcut of choosing a single plan label and dropping all of the information needed to review it.
def identity_view(registry, report):
if registry["id"] != report["fund"]["id"]:
raise ValueError("Canonical fund identities do not match")
identity = report.get("identity", {})
profile = report.get("profile", {})
return {
"fund_id": registry["id"],
"fund_slug": registry["slug"],
"official_name": registry["official_name"],
"family": registry.get("family"),
"registry_plan_name": registry.get("plan_name"),
"report_date": report["report_date"],
"reported_plan_name": identity.get("plan_name_as_reported"),
"reported_unit_classes": profile.get("unit_classes"),
"report_sub_funds": [
{"id": row["id"], "report_id": row["report_id"],
"sub_fund_key": row["sub_fund_key"],
"sub_fund_name_raw": row["sub_fund_name_raw"]}
for row in report.get("sub_funds", [])
],
}Make the selected identity visible across the whole profile#
Use a persistent fund heading containing the official name, AMC, optional family and plan context. Place the report date next to the profile and reported-performance sections. Inside portfolio panels, show report-scoped sub-fund context when rows provide it. A user should be able to tell whether holdings, allocations and credit quality describe the selected canonical record or a selected component within its report.
Display unit-class information as reported context, with an availability label and a source reference where available. Do not add a class selector that appears to retrieve class-specific performance unless the actual supported data flow resolves that distinction. A precise read-only label is a better experience than an interactive control that merely renames the same fund-level NAV series for several fictional classes.
Test collisions, nulls and changed labels#
Use two fictional plans with similar names but different public fund IDs, a report with a different printed plan label, a null unit_classes list and repeated sub_fund_key values across fragments. Assert that registry and report IDs must match before combining the record. Verify that missing class information does not become an empty certified class catalog and that one plan's reported fees never migrate to another plan through a name-only join.
The export and AI evidence packet should preserve the same distinctions as the interface: canonical fund identity, optional family, registry plan label, report period, reported plan label and report-scoped component context. A researcher can then review an apparent naming difference without guessing which facts were combined. Extend the identity model only when the published contract or applicable source evidence supports the additional relationship.
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
{
"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
{
"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
}
}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.
- ILovePSX public API reference
Operations and field behaviour reviewed against the local published contract on 9 October 2026. This review does not establish current production coverage.
- Structured Fund Manager Reports API
- API access and integration documentation
- Al Meezan: Meezan Islamic Fund consolidated offering document
Consulted on 9 October 2026 for unit-type/class terminology and fund-specific terms. The PDF states an update through a May 2025 supplement; no fee schedule or class availability is reproduced as a current recommendation.
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.
Inspect fund and report identity fields