On this page
Power Query is useful for repeatable research tables, but a workbook should not become a container for the API key that collected the data. A copied workbook can reveal query text and cached tables to its recipient.
This guide uses a private Python collector to fetch complete dated NAV rows, then loads its local JSON export into Excel. The workbook contains the data transformation and a local file path. Authentication and pagination happen before Excel refreshes the research table.
The useful part, upfront.
- Keep X-API-Key authentication in a private collector, outside M code.
- Load a completed JSON export and retain exact NAV as text.
- Distinguish workbook refresh time, export retrieval time and NAV source date.
Choose a credential boundary you can explain#
The fund API authenticates through the X-API-Key header. Microsoft's Web.Contents ApiKeyName option identifies a URL key parameter; it does not automatically become secure storage for an arbitrary X-API-Key header. Supplying the literal secret through Headers in distributed M code would expose it to people able to inspect that code.
Use the private collector from the pagination guide instead. It sends the header directly to the fixed API host and writes nav-export.json after completing the selected history. Power Query reads that file. This pattern avoids inventing a connector-specific secure header capability and works without operating an open proxy. A production custom connector is a separate engineering task, requiring explicit credential handling and a supported deployment environment.
References: Microsoft Web.Contents credential and header options · ILovePSX authentication, scopes and limits
Collect the selected range before refreshing Excel#
Set the API key only in the collector's private environment. Select a returned fund slug and explicit NAV_FROM and NAV_TO dates, then run collect_nav.py. Keep the export in an owner-controlled directory that Excel can read. The file contains selection, retrieved_at, pages and rows; these are the collector's export fields, not a newly advertised API endpoint.
The rows preserve complete API NAV records and their decimal strings. The pages array retains response metadata for investigating pagination and source dates. If the collector fails, the last completed export remains in place. Do not read the collector's temporary file, and do not store credentials beside a workbook intended for distribution.
References: ILovePSX public API reference
Create a query with explicit types and an empty-table schema#
Use an Excel environment with Power Query and local file access. Create a blank query through the Data tools and open its Advanced Editor. Paste the M expression below, replacing the example file path with the actual completed export path. This article has not executed M inside Excel; the expression follows the cited Microsoft function contracts, and the Python export and JSON inputs have been checked separately.
The query gives an empty result the same column names as an observed result. It converts NAV dates to dates and keeps nav as text, then adds the export retrieval time and an explicit selection state. The source query remains a faithful projection. Create chart or presentation columns in a separate query so approximate conversions cannot overwrite the exact data.
let
Export = Json.Document(File.Contents("C:\FundResearch\nav-export.json")),
Fields = {"fund_slug", "fund_name", "nav_date", "nav", "currency"},
Rows = Table.FromRecords(Export[rows], Fields, MissingField.UseNull),
Typed = Table.TransformColumnTypes(Rows, {
{"fund_slug", type text}, {"fund_name", type text},
{"nav_date", type date}, {"nav", type text}, {"currency", type text}
}),
Retrieved = Table.AddColumn(Typed, "export_retrieved_at",
each Export[retrieved_at], type text),
State = Table.AddColumn(Retrieved, "selection_state",
each "OBSERVED", type text)
in
StateReferences: Microsoft Json.Document · Microsoft File.Contents · Microsoft Table.FromRecords
Give an empty selection a visible status table#
A query returning zero rows can look like a broken refresh unless the workbook separately describes the selection. Add the second query below and load its one-row output near the main research table. It stays visible for both observed and empty exports and identifies the date bounds that the collector actually completed.
Do not replace an empty NAV table with a made-up zero row. The status table is an application projection that says NO_OBSERVATIONS, with the selected fund and retrieval time. If Excel cannot open or parse the file, allow the refresh to fail visibly; do not catch every error and convert it into the same status as a valid empty API selection.
let
Export = Json.Document(File.Contents("C:\FundResearch\nav-export.json")),
Count = List.Count(Export[rows]),
Status = Table.FromRecords({[
fund_slug = Export[selection][fund_slug],
requested_from = Export[selection][from],
requested_to = Export[selection][to],
observation_count = Count,
export_retrieved_at = Export[retrieved_at],
selection_state = if Count = 0 then "NO_OBSERVATIONS" else "OBSERVED"
]})
in
StatusReferences: Microsoft Json.Document · Microsoft Table.FromRecords
Present exact observations and their dates together#
The fictional table below models what the NAV query displays. Keep nav as text in the research table to preserve the received decimal representation, including trailing zeros. Formatting Excel's numeric column to six decimal places cannot recreate precision already lost during a conversion; representation and display formatting are different concerns.
For a chart, add a clearly named approximate NAV column in a derived query. Label the chart NAV per unit, PKR and show the observed date range. A line connecting two observations does not prove daily intervening values exist. Avoid a title such as Fund return unless you have separately established the distribution and reinvestment method required for that measure.
| fund_slug | nav_date | nav (text) | currency | selection_state |
|---|---|---|---|---|
| example-research-fund | 2026-09-28 | 100.125000 | PKR | OBSERVED |
| example-research-fund | 2026-09-30 | 100.500000 | PKR | OBSERVED |
References: ILovePSX NAV API guide
Make refresh order and failure state visible#
Refreshing Excel reloads the local file; it does not call the fund API or guarantee a newer export. Run the collector successfully first, then refresh the workbook. The export retrieval timestamp makes this order auditable. Keep any workbook refresh timestamp separately, and never use it to label the latest source observation as today's NAV.
If the collector cannot authenticate or encounters an invalid selection, fix that failure before refreshing. If Excel cannot access the path, check its local data-source permissions and the selected environment. A recipient on another computer may not have that path. That is an explicit portability limitation of the local-file workflow rather than a reason to copy your private API credential into the workbook.
References: Microsoft File.Contents · ILovePSX authentication, scopes and limits
Extend the workbook to the full fund context#
NAV is only one dimension of research. A separate report collector can request monthly profile, reported performance, holdings, asset allocation, sector allocation and credit-quality facts. Use documented endpoints, keep report_date and data_version and retain the source document context where available. The complete FMR model uses explicit expansions; holdings and allocations are not an invented nested portfolio property.
Keep each report section in its own table, with fund identity and report period as join columns. Holdings percentages may use total assets, net assets or another stated basis. Aggregate credit buckets and individual security ratings are different facts. A workbook should preserve those distinctions before a dashboard compares funds or combines disclosures across dates.
References: ILovePSX public API reference
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.
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 the NAV and report contracts