On this page
A holdings weight is more useful when a researcher can identify the report period, source page and active record behind it. Provenance connects the full fund profile to the evidence supporting its performance and portfolio tables. That connection must survive formatting, filtering, export and an AI-generated summary.
This guide focuses on consumer-side tracing through the published ILovePSX complete-report contract. It explains the source array, page fragments and version context with a fictional multi-page example. It is separate from the internal validation pipeline and from the workflow for fetching revised periods: the task here is making a displayed fact explainable.
The useful part, upfront.
- Keep report_date, report_id and page_number with each supported section row.
- Source is an array; document can be null and source_url can be unavailable.
- API data_version and promoted_at describe record context, not a proven issuer revision.
Define what a source reference needs to answer#
For each displayed fact, preserve the fund identity, the report period, the section, the reported label and its source context. A source link alone is insufficient: a large PDF can contain several funds and many portfolio tables. Conversely, a public report ID can trace the API record even when no document link is available. Keep the difference visible instead of treating the missing URL as permission to invent one.
The research question determines the required context. A complete-report profile value can be assembled from active page fragments, while a holding row carries its own report_id and page_number. Reported performance also requires interval and return basis. A useful evidence panel supplies those distinctions without making the researcher inspect private extraction records or understand the database's internal identifiers.
Request the complete record with source context#
Use the dated complete FMR route with include=all when your page needs profile, reported performance, holdings, allocations and source evidence together. Source is also a default complete-report expansion, but holdings and allocations are not. Reading a focused portfolio operation alone does not give the same complete source array, so plan the retrieval according to the evidence your interface needs.
The complete record contains report_ids, report_fragments and source. The top-level id is a single report fragment's public ID when exactly one fragment contributes; it is null when several fragments contribute. A null top-level id therefore does not mean the whole record lacks identity. Retain the full report_ids array and the fund's public ID rather than replacing them with one guessed report key.
curl --fail-with-body --silent --show-error \
--header "X-API-Key: $ILOVEPSX_API_KEY" \
"https://funds.api.ilovepsx.com/v1/mutual-funds/funds/$FUND_SLUG/fmr-reports/2026-09-30?include=all"References: ILovePSX public API reference
Read the source array as page-level context#
A source entry contains report_id, page_number, document, promoted_at and data_version. When a document is present, its public context includes id, document_type, source_url, report_date and sha256. The document object can be null. Several source entries may refer to pages from the same document, so deduplicating by URL alone can erase a useful page reference.
A document's report_date, the complete report's report_date, a fragment's promoted_at and your application's retrieval time answer different questions. Show the reporting period as the date of the disclosed record, promotion time as API lifecycle context when useful, and retrieval time as your own observation. Do not display promoted_at as the date the AMC published its report unless separately supported evidence establishes that fact.
References: ILovePSX public API reference
A fictional two-page report with a missing source link#
The selected-field example below joins a synthetic holding to page 2 of a two-fragment record. Both documents are null because no real source document exists for the mock. The public UUIDs, page numbers and version values are invented. This teaching view omits unrelated complete-report fields; it does not add a source URL or pretend to be a production response.
The holding's report_id points to the second fragment, not the first source entry. Its page_number is an additional consistency check. The top-level data_version is 2 because the contributing fragments have versions 1 and 2; it does not mean every page was corrected together. Keep per-fragment version context for a precise explanation of which record the displayed row belongs to.
{
"id": null,
"report_date": "2026-09-30",
"data_version": 2,
"report_ids": [
"00000000-0000-4000-8000-000000000601",
"00000000-0000-4000-8000-000000000602"
],
"source": [
{"report_id": "00000000-0000-4000-8000-000000000601",
"page_number": 1, "document": null,
"promoted_at": "2026-10-08T08:00:00Z", "data_version": 1},
{"report_id": "00000000-0000-4000-8000-000000000602",
"page_number": 2, "document": null,
"promoted_at": "2026-10-09T08:00:00Z", "data_version": 2}
],
"holdings": [
{"report_id": "00000000-0000-4000-8000-000000000602",
"page_number": 2, "name_raw": "Example Industrials",
"percent_of_total_assets": "18.000000"}
]
}Join a row to the matching source, not the first source#
The Python function below joins by report_id and page_number and requires one exact match. It returns your application's evidence state alongside the matching entry. No network request, source download or model call is needed to perform this check. A null document produces SOURCE_LINK_UNAVAILABLE while keeping the report and page context available.
If there are no matching entries or more than one exact candidate, keep a review state. Do not borrow another page's source just to make the citation button appear. A matching document can still have source_url: null, and a present URL deserves normal link validation in your application. The function establishes the API-context join; it does not prove the source contains a specific value without further source inspection.
def row_source(report, row):
report_id = row.get("report_id")
page = row.get("page_number")
if report_id is None or page is None:
return {"state": "ROW_CONTEXT_UNAVAILABLE", "source": None}
matches = [entry for entry in report.get("source", [])
if entry.get("report_id") == report_id
and entry.get("page_number") == page]
if len(matches) != 1:
return {"state": "SOURCE_CONTEXT_REVIEW", "source": None}
entry = matches[0]
document = entry.get("document")
url = document.get("source_url") if document is not None else None
return {"state": "SOURCE_LINK_AVAILABLE" if url else "SOURCE_LINK_UNAVAILABLE",
"source": entry}Explain versions without attributing an unsupported correction#
data_version describes the promoted API record's version. schema_version describes the extraction record's schema context. Neither independently proves that the AMC issued a replacement PDF. The public revisions operation provides ACTIVE and SUPERSEDED metadata for the same fund and report date; it does not explain every cause of change or provide a complete superseded report body by version.
When your interface refreshes after a version change, say Updated API report data unless issuer evidence supports stronger wording. Preserve the selected period and matching source entries with the refreshed facts. A cached holding from an older record should not be paired with a new source array merely because the report date stayed constant. Update the coherent research record or clearly identify the retained snapshot.
References: ILovePSX public API reference
Make evidence usable in the interface and the export#
Place report period and availability near each research panel, then offer a compact evidence view with section label, public report ID, page number, available document link and record version. Keep a text explanation when the source link is missing. Profiles may combine several fragments, so show their contributing context rather than pretending every top-level value has a field-specific source locator.
Carry the same context into exports and AI retrieval packets. A source-grounded assistant can cite the selected report period and page reference while acknowledging an unavailable link. It should not manufacture a citation or expose private integer IDs. Preserve synthetic labels in demonstration exports so a rich mock model remains useful for design without becoming a false research dataset when copied into another tool.
| Evidence item | Useful display | Avoid |
|---|---|---|
| report_date | Report period | Today's date as a substitute |
| page_number | Page context for the matched report fragment | First document page by default |
| source.document null | Source link unavailable | Invented PDF URL |
| data_version | API record version | Unproven issuer correction label |
Test the evidence path for every portfolio panel#
Use fixtures where the selected row belongs to the second source entry, where document is null, where source_url is null and where a page number disagrees. Test duplicate source candidates and a record with several fragments at different versions. A correct join should remain correct after sorting holdings or filtering credit-quality allocations; row order must never become the citation key.
Also test the visible result: the source state stays readable on mobile, the selected period survives export, and a mock never acquires an unlabeled real-data presentation. For an authenticated document-fetching feature added later, validate destinations independently and keep API authorization out of document requests. Tracing published evidence should help researchers inspect a fact, not create a new route for exposing credentials or private processing artifacts.
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
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 report source and version fields