# ILovePSX Funds API — developer guide Updated: 2026-10-09. Base URL: https://funds.api.ilovepsx.com. API major version: v1. Canonical Pakistani mutual fund registry, dated NAV, observed payouts and validated monthly Fund Manager Report data. This is public documentation, not live fund data. ## Your first request Start with the registry. It gives you the fund slugs to use in every later request. 1. Sign in using your existing ILovePSX account and explicitly enable fund API access. Activation requires your verified primary email, WhatsApp number, intended use and terms acknowledgement. 2. Open Dashboard → API keys. Create a key with funds:read, then add nav:read or fmr:read for the data you need. Save the secret when it is shown once. 3. Set ILOVEPSX_API_KEY in your server's environment or secret manager. The examples read it at runtime. Never commit the value or expose it through NEXT_PUBLIC_* variables. 4. Run the registry request below. A 200 response contains success, data and meta. Choose a data[].slug, then use that exact slug in NAV, report or payout requests. The cURL examples use Bash/POSIX syntax. For PowerShell, Python and JavaScript, use the language selector. Python needs httpx; JavaScript examples run on a modern Node.js server. ### PowerShell · first request ```powershell $headers = @{ "X-API-Key" = $env:ILOVEPSX_API_KEY } $response = Invoke-RestMethod -Headers $headers -Uri "https://funds.api.ilovepsx.com/v1/mutual-funds/funds?per_page=10" $response.data | Select-Object name, slug ``` ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds?per_page=10" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds?per_page=10", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds?per_page=10", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ## Choose the right endpoint Use the registry for identity, NAV for dated prices, and Fund Manager Reports for reported monthly facts. - [Find funds and AMCs](https://funds.api.ilovepsx.com/docs/reference#list_mutual_funds): Search and filter the canonical registry; retrieve stable public IDs and slugs. - [Read the latest available NAV](https://funds.api.ilovepsx.com/docs/reference#get_latest_mutual_fund_navs): Use repeated funds query parameters to select fund slugs; inspect each record's nav_date. - [Collect NAV history](https://funds.api.ilovepsx.com/docs/reference#get_mutual_fund_nav_history): Bound the date range and follow the opaque next_cursor. - [Read a complete monthly report](https://funds.api.ilovepsx.com/docs/reference#get_latest_complete_fmr_report): Use include=all for expanded reported sections; availability varies by fund and period. - [Retrieve observed payouts](https://funds.api.ilovepsx.com/docs/reference#get_mutual_fund_payout_history): Use payout_date, amount_per_unit and coverage; an empty result does not prove no distributions. - [Batch several funds](https://funds.api.ilovepsx.com/docs/reference#post_bulk_mutual_fund_nav): POST a funds list to the bounded bulk endpoints; inspect meta.missing_funds. - [Discover capabilities](https://funds.api.ilovepsx.com/docs/reference#get_api_catalog): Read the authenticated catalog for supported fields and endpoint capabilities. The API serves canonical registry/NAV records and active promoted FMR facts. Raw extraction, staging and review controls are private. Derived analytics remain conditional and are excluded from this public reference until verified. Stock data, a hosted MCP server and an official client SDK are not provided here. ## Authentication and scopes Every data request uses your API key in the X-API-Key header. Reading these docs needs no account. | Scope | What it allows | | --- | --- | | funds:read | Registry, fund profiles, AMCs and classification vocabularies | | nav:read | Latest/historical NAV, NAV batches and observed payouts | | fmr:read | Reports, snapshots, reported performance and portfolio sections | | catalog:read | API catalog, fields, enums and production coverage metadata | | updates:read | Incremental production update events | The reference shows the required scope for each endpoint; the key must also belong to an active account. Login sessions manage your account in the portal; use an API key for integrations. Visiting account status does not activate the service or create a key. Use separate keys for separate integrations. Rotation immediately revokes the previous secret, so update your server secret when rotating. A revoked secret cannot be recovered. Keep keys out of URLs, client bundles, browser storage, logs, screenshots and AI prompts. Use the authenticated explorer to try data requests without pasting a key into these docs. ## Read a response Successful JSON has a common envelope. Dataset fields inside data depend on the endpoint. ### Synthetic NAV response · fictional fund and values ```json { "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 } } ``` | Field | Meaning | | --- | --- | | success | true for a successful JSON response | | data | An array or object specific to the endpoint; empty arrays are valid | | meta.request_id | Correlation ID to retain for debugging and support | | meta.generated_at | UTC time when the response was constructed; not the source observation date | | meta.data_as_of | Available source date; inspect row dates too when comparing multiple funds | | meta.data_freshness_days | Source age when supplied; null means unavailable, not fresh | | meta.next_cursor | Opaque next-page token, or null when this feed is exhausted | | meta.missing_funds | Requested slugs missing from a bulk result when this field is present | The OpenAPI contract describes authentication, parameters, request bodies and the shared envelope. Many dataset data fields are not fully typed in that schema. Do not generate assumptions from the generic data property; use these labelled examples, the detailed guides and the authenticated explorer to inspect actual results. - [Download the synthetic complete FMR response](https://funds.api.ilovepsx.com/blog/examples/fmr-response.json): All expanded sections, with fictional identifiers/values and no fabricated source document. - [Download the synthetic NAV response](https://funds.api.ilovepsx.com/blog/examples/nav-response.json): Exact decimal strings and explicit nulls. These are teaching fixtures, not live fund data. ## Decimals, dates and missing values Preserve the source meaning through storage, calculations and display. | Convention | Integration rule | | --- | --- | | Financial decimals | JSON strings preserve precision. Use Decimal or a decimal library for calculations. | | Percentages | Percentage points: 5.25 represents 5.25%, not a 0.0525 stored fraction. | | Dates | YYYY-MM-DD. NAV dates and FMR report dates are different concepts. | | Timestamps | UTC ISO-8601. Keep source dates separate from generated_at. | | Currency | NAV prices and payout amounts are PKR; retain currency fields when supplied. | | null / absent | Unavailable or inapplicable facts; never silently replace them with zero. | | Identity | Use public UUIDs and registry slugs. Do not invent a slug from a display name. | | Latest | Latest available production observation, which may be older than today. | ### Python · calculate using exact decimals ```python from decimal import Decimal # Illustrative values, not investment advice or observed fund prices. nav = Decimal("100.500000") units = Decimal("12.5") value_pkr = nav * units assert value_pkr == Decimal("1256.2500000") print(value_pkr) ``` Do not treat raw NAV change as an investor's total return: distributions, fees, unit adjustments and the chosen observation dates can affect interpretation. Monthly reported returns must retain their report period and original labels. ## Fund Manager Reports and coverage A valid fund can have no promoted report for a requested month. A valid report can have missing sections. - List /funds/{fund_slug}/fmr-reports to discover available reporting dates. Use a date returned by that list when requesting a historical report. - For a complete report, add include=all, or request the supported expansions explicitly. A default report can omit sections that were not requested. - Keep report_date, data_version, report fragments and supplied provenance together. NAV source dates and FMR periods should not be combined into one freshness label. - An omitted expansion, NOT_REPORTED section and unavailable report are different states. A section's empty rows do not justify inventing holdings or allocation weights. - Credit quality is available through its focused endpoint and reported allocations. Do not invent a credit_quality expansion. Portfolio coverage and denominators differ by section. Extraction goes through validation, staging and matching/review before production promotion. This process does not guarantee complete AMC coverage or that every source fact was reported. For corrections, retain public report versions and process update events idempotently. | Complete-report include | Sections | | --- | --- | | Default | sub_funds, reported_returns, metrics, fees, ratings, parties, source | | Additional expansions | allocations, holdings, special_terms, compliance, notes | | all | Every supported complete-report expansion. This does not guarantee populated rows. | | Example | include=holdings,allocations or repeated include=holdings&include=allocations | - [FMR integration guide](https://funds.api.ilovepsx.com/fund-manager-reports-api): Reporting periods, provenance and expanded sections. - [Portfolio and research guides](https://funds.api.ilovepsx.com/blog): Worked examples for holdings, allocations, benchmarks and missing-data interpretation. ## Pagination and synchronization Follow the pagination style published for the endpoint. Keep the filters stable between pages. | Style | How to continue | | --- | --- | | page / per_page | Start at page=1. Use returned meta.has_next / total_pages and effective per_page. | | cursor / limit | Pass meta.next_cursor unchanged. Stop when it is null; keep fund, range and order unchanged. | | Repeated array parameters | Use funds=SLUG_A&funds=SLUG_B or category=VALUE_A&category=VALUE_B, not a comma-joined list unless explicitly supported. | | Bulk bodies | POST a JSON funds array. Inspect missing_funds rather than assuming every requested fund appears. | ### Python · collect registry pages ```python import os import httpx with httpx.Client( base_url="https://funds.api.ilovepsx.com", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) as client: page = 1 while True: response = client.get("/v1/mutual-funds/funds", params={"page": page, "per_page": 100}) response.raise_for_status() payload = response.json() for fund in payload["data"]: print(fund["slug"]) if not payload["meta"]["has_next"]: break page += 1 ``` For cursor feeds, replace only cursor in the original query and URL-encode it with your HTTP client. Do not decode, alter or use a cursor for a different filter. Save synchronization checkpoints only after you have processed a page successfully. ## Request bounds and batch reads Ask for only the data you need. Operational bounds remain active under the free offer. | Operation | Published default / bound | | --- | --- | | Registry lists | per_page defaults to 50; the default service maximum is 100 and returned meta shows the effective size. | | NAV history | limit defaults to 500; schema maximum 1000. Default maximum date span is 3653 days. | | Payout history | limit defaults to 100, maximum 500. Default range is 1827 days; maximum span is 1830 days. | | FMR report lists | page defaults to 1; per_page defaults to 50, maximum 100. | | Bulk fund selection | Default service maximum 100 fund slugs; required non-empty funds array. | | Bulk NAV date | date omitted reads latest; date supplied uses the requested date_policy. Bulk from/to fields are not a NAV history interface. | Schema bounds and deployed service settings are distinct: a request can fit the OpenAPI type but exceed a service bound. Handle a 422 response and inspect the authenticated catalog rather than increasing payloads indefinitely. Do not assume every endpoint supports all filters. ## Free usage and rate limits The current offer has free unlimited monthly usage, with burst protection per key. There is no monthly usage bill or payment-card requirement. The current burst limit is 600 weighted units per minute per key, with a separate explorer-session bucket. Units represent endpoint workload. Future pricing will be announced separately. | Read | Weighted units | | --- | --- | | Standard registry, NAV history, payouts and focused FMR reads | 1 | | Complete FMR and latest complete snapshot | 2 | | GET NAV bulk / POST fund bulk | 2 | | POST NAV bulk / VPS family snapshot | 3 | | POST snapshot bulk | 5 | | Response header | Action | | --- | --- | | RateLimit-Limit | Weighted burst capacity | | RateLimit-Remaining | Remaining weighted capacity in this bucket | | RateLimit-Reset | Bucket reset information; do not assume it is a source-data timestamp | | Retry-After | Wait the indicated duration after a 429 before retrying | | X-Monthly-Quota-Limit | unlimited under the current free offer | | X-Request-ID | Retain this ID for failures and support | Rejected authorization and limit checks do not consume units; server-error reservations are refunded. Successful reads and conditional requests still follow access and burst policy. Activity history can lag enforcement by a few seconds. Avoid synchronized parallel retry storms. ## Caching and resilient requests Use bounded requests, explicit timeouts and a retry policy that understands the response. - Where an ETag is supplied, store it with the response and send If-None-Match on the next read. A 304 has no JSON body: reuse your cached data. - Cache by the complete URL, filters and customer context. Keep authenticated responses in your own private application cache; never expose customer credentials through a shared cache. - ETags represent a complete response, including changing generation metadata. A subsequent request can return 200 even when the underlying facts look unchanged; do not depend on 304 for correctness. - For 429, honor Retry-After. For transient 500/503 or network failures, use bounded exponential backoff with jitter and a maximum attempt count. Keep failed batches/checkpoints recoverable. - Do not retry invalid keys, missing scopes, unavailable funds or invalid input indefinitely. Surface the problem code and request ID. Read-only bulk POSTs query data; they do not write production facts. - Disable credential-bearing redirects and validate JSON/error responses before using them. Avoid logging headers or full response bodies that could contain customer secrets. ## Troubleshoot with a request ID Errors use application/problem+json. Inspect the HTTP status and stable code before deciding what to do. ### Synthetic validation error ```json { "type": "https://api.ilovepsx.com/problems/validation-error", "title": "Request validation failed", "status": 422, "detail": "One or more request values are invalid.", "instance": "/v1/mutual-funds/funds", "request_id": "example-request-id", "code": "VALIDATION_ERROR", "errors": [ { "location": "query.page", "message": "Input should be greater than or equal to 1", "type": "greater_than_equal" } ] } ``` | Status | Likely cause | Next step | | --- | --- | --- | | 400 / 422 | Invalid filters, bounds, date or expansion | Inspect code and errors; correct the request before retrying. | | 401 | Missing, invalid, inactive or expired API key | Check the server environment and key status; rotate if needed. | | 403 | Missing scope or unavailable account | Check required scope, activation and account status. | | 404 | Unknown fund or unavailable production report | Use the registry and report catalog; represent absence explicitly. | | 429 | Weighted burst capacity exceeded | Wait Retry-After, reduce concurrency and retry within a bound. | | 500 / 503 | Service or dependency failure | Retry with backoff; retain request ID and UTC timestamp. | ## Use these docs with AI Give a coding assistant the public contract and integration rules without sharing your credentials. Copy the AI prompt, or download the guide/reference as Markdown and attach them to your assistant. Assistants with URL-reading tools can begin at /llms.txt. If yours cannot fetch URLs, attach /llms-full.txt or the OpenAPI JSON instead. ### AI integration prompt ```text Use the ILovePSX Funds API to implement my integration. First read https://funds.api.ilovepsx.com/llms.txt and https://funds.api.ilovepsx.com/docs/index.md, then the relevant operations in https://funds.api.ilovepsx.com/docs/reference.md or import https://funds.api.ilovepsx.com/docs/openapi. Ask me which language and dataset I need. Use only published endpoints. Read ILOVEPSX_API_KEY from a server environment variable; never ask me to paste a secret into chat. Discover fund slugs from the registry. Preserve exact decimal strings, nulls, source dates, FMR reporting periods and provenance. Handle pagination, missing reports, 304, 429 Retry-After and bounded retries. Do not invent coverage, analytics endpoints, SDKs or an MCP server. Clearly label synthetic examples and cite the documentation used. Produce runnable server-side code and explain setup and error handling. ``` - [AI integration resources](https://funds.api.ilovepsx.com/docs/ai): Prompt, compact discovery index, complete context and importable contract. - [OpenAPI JSON](https://funds.api.ilovepsx.com/docs/openapi): Import into an API client or code generator. Dataset response typing remains partial. - [Full AI context](https://funds.api.ilovepsx.com/llms-full.txt): One plain-text file containing the guide, endpoint reference and shared schemas. These resources are documentation. They do not grant account access, run API requests or install a connector. Any live request still needs an active account and an appropriately scoped server-side key. AI-produced code should preserve missing values and source dates and be checked against the published contract. ## Support and next steps Include enough context to investigate your integration without exposing a secret. - Send the request ID, method and endpoint, UTC timestamp, status/problem code and a short description. Include your public account ID when relevant. - Redact full API keys, bearer tokens and customer details from logs or screenshots. - Use the dashboard for keys, usage and request history; use the explorer for authenticated data inspection. Deeper guides are in the public blog library. Support: zia639329@gmail.com; WhatsApp +923194583904. Never send a full API key. # ILovePSX Funds API reference Contract refreshed: 2026-10-09. Base URL: https://funds.api.ilovepsx.com. Every listed operation requires X-API-Key. Replace YOUR_* identifiers using the registry. Example dates are illustrative. Only public data endpoints are included; conditional analytics and customer/operator controls are excluded. ## GET /v1/catalog Api Catalog Operation ID: get_api_catalog Required scopes: catalog:read Weighted cost: 1 units. ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/catalog" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/catalog", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/catalog", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/catalog/mutual-funds/fields Field Catalog Operation ID: get_mutual_fund_field_catalog Required scopes: catalog:read Weighted cost: 1 units. ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/catalog/mutual-funds/fields" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/catalog/mutual-funds/fields", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/catalog/mutual-funds/fields", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/catalog/mutual-funds/enums Enum Catalog Operation ID: get_mutual_fund_enums Required scopes: catalog:read Weighted cost: 1 units. ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/catalog/mutual-funds/enums" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/catalog/mutual-funds/enums", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/catalog/mutual-funds/enums", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/coverage Coverage Operation ID: get_mutual_fund_data_coverage Required scopes: catalog:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | page | query | integer | no | Default: 1; Minimum: 1 | | per_page | query | integer | no | Default: 50; Minimum: 1; Maximum: 100 | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/coverage" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/coverage", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/coverage", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/updates Updates Operation ID: get_mutual_fund_updates Required scopes: updates:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | cursor | query | string | null | no | No additional schema constraints published. | | datasets | query | string[] | null | no | No additional schema constraints published. | | limit | query | integer | no | Default: 100; Minimum: 1; Maximum: 500 | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/updates" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/updates", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/updates", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/amcs List Amcs Operation ID: list_mutual_fund_amcs Required scopes: funds:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | page | query | integer | no | Default: 1; Minimum: 1 | | per_page | query | integer | no | Default: 50; Minimum: 1 | | is_active | query | boolean | null | no | Default: true | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/amcs" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/amcs", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/amcs", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/amcs/{amc_slug} Get Amc Operation ID: get_mutual_fund_amc Required scopes: funds:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | amc_slug | path | string | yes | No additional schema constraints published. | | page | query | integer | no | Default: 1; Minimum: 1 | | per_page | query | integer | no | Default: 50; Minimum: 1 | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/amcs/YOUR_AMC_SLUG" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/amcs/YOUR_AMC_SLUG", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/amcs/YOUR_AMC_SLUG", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds List Funds Operation ID: list_mutual_funds Required scopes: funds:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | q | query | string | null | no | No additional schema constraints published. | | amc | query | string | null | no | No additional schema constraints published. | | category | query | string[] | null | no | No additional schema constraints published. | | scheme_type | query | string[] | null | no | No additional schema constraints published. | | risk_profile | query | string[] | null | no | No additional schema constraints published. | | is_shariah_compliant | query | boolean | null | no | No additional schema constraints published. | | is_exchange_traded | query | boolean | null | no | No additional schema constraints published. | | is_fund_of_funds | query | boolean | null | no | No additional schema constraints published. | | lifecycle_status | query | string | null | no | Default: "ACTIVE" | | family | query | string | null | no | No additional schema constraints published. | | sort | query | string | no | Default: "name_asc" | | page | query | integer | no | Default: 1; Minimum: 1 | | per_page | query | integer | no | Default: 50; Minimum: 1 | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds?per_page=10" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds?per_page=10", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds?per_page=10", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug} Get Fund Operation ID: get_mutual_fund Required scopes: funds:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/categories Categories Operation ID: list_mutual_fund_categories Required scopes: funds:read Weighted cost: 1 units. ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/categories" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/categories", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/categories", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/fund-types Fund Types Operation ID: list_mutual_fund_types Required scopes: funds:read Weighted cost: 1 units. ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/fund-types" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/fund-types", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/fund-types", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/families Families Operation ID: list_mutual_fund_families Required scopes: funds:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | family_type | query | string | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/families" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/families", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/families", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/families/{family_slug} Family Operation ID: get_mutual_fund_family Required scopes: funds:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | family_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/families/YOUR_FAMILY_SLUG" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/families/YOUR_FAMILY_SLUG", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/families/YOUR_FAMILY_SLUG", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/vps Vps Operation ID: list_vps_families Required scopes: funds:read Weighted cost: 1 units. ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/vps" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/vps", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/vps", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/vps/{family_slug}/allocations Vps Allocations Operation ID: get_vps_allocations Required scopes: funds:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | family_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/vps/YOUR_FAMILY_SLUG/allocations" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/vps/YOUR_FAMILY_SLUG/allocations", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/vps/YOUR_FAMILY_SLUG/allocations", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/payouts Verified fund payout history Observed official MUFAP payout events, not proof of complete history. Defaults to five years; at most 1830 days per query. Exact PKR decimals are strings. Requires nav:read. Operation ID: get_mutual_fund_payout_history Required scopes: nav:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | | cursor | query | string | null | no | Maximum length: 2000 | | limit | query | integer | no | Default: 100; Minimum: 1; Maximum: 500 | | order | query | string | no | Default: "desc" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/payouts" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/payouts", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/payouts", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/nav/latest Latest Navs Operation ID: get_latest_mutual_fund_navs Required scopes: nav:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | funds | query | string[] | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/nav/latest?funds=YOUR_FUND_SLUG" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/nav/latest?funds=YOUR_FUND_SLUG", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/nav/latest?funds=YOUR_FUND_SLUG", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/nav/bulk Bulk Nav Get Operation ID: get_bulk_mutual_fund_nav Required scopes: nav:read Weighted cost: 2 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | date | query | string (date) | yes | No additional schema constraints published. | | funds | query | string[] | yes | No additional schema constraints published. | | date_policy | query | string | no | Default: "exact" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/nav/bulk?date=2026-09-30&funds=YOUR_FUND_SLUG" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/nav/bulk?date=2026-09-30&funds=YOUR_FUND_SLUG", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/nav/bulk?date=2026-09-30&funds=YOUR_FUND_SLUG", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/nav Nav History Operation ID: get_mutual_fund_nav_history Required scopes: nav:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | | cursor | query | string | null | no | No additional schema constraints published. | | limit | query | integer | no | Default: 500; Minimum: 1; Maximum: 1000 | | order | query | string | no | Default: "asc" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/nav" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/nav", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/nav", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/snapshot/latest Latest Snapshot Operation ID: get_latest_mutual_fund_snapshot Required scopes: fmr:read Weighted cost: 2 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/snapshot/latest" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/snapshot/latest", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/snapshot/latest", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/snapshot/history Snapshot History Operation ID: get_mutual_fund_snapshot_history Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | page | query | integer | no | Default: 1; Minimum: 1 | | per_page | query | integer | no | Default: 50; Minimum: 1; Maximum: 100 | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/snapshot/history" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/snapshot/history", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/snapshot/history", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/fmr-reports Fmr Reports Operation ID: list_mutual_fund_fmr_reports Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | page | query | integer | no | Default: 1; Minimum: 1 | | per_page | query | integer | no | Default: 50; Minimum: 1; Maximum: 100 | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/fmr-reports/latest Latest Fmr Report Operation ID: get_latest_complete_fmr_report Required scopes: fmr:read Weighted cost: 2 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | include | query | string[] | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/latest?include=all" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/latest?include=all", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/latest?include=all", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/fmr-reports/{report_date}/revisions Fmr Revisions Operation ID: get_fmr_report_revisions Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | report_date | path | string (date) | yes | No additional schema constraints published. | | fund_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/2026-09-30/revisions" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/2026-09-30/revisions", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/2026-09-30/revisions", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/fmr-reports/{report_date} Dated Fmr Report Operation ID: get_complete_fmr_report Required scopes: fmr:read Weighted cost: 2 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | report_date | path | string (date) | yes | No additional schema constraints published. | | fund_slug | path | string | yes | No additional schema constraints published. | | include | query | string[] | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/2026-09-30?include=all" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/2026-09-30?include=all", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fmr-reports/2026-09-30?include=all", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/asset-allocation/latest Latest Asset Allocation Operation ID: get_latest_asset_allocation Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | allocation_type | query | string | no | Default: "ASSET_ALLOCATION" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/asset-allocation/latest" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/asset-allocation/latest", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/asset-allocation/latest", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/asset-allocation/history Asset Allocation History Operation ID: get_asset_allocation_history Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | | allocation_type | query | string | no | Default: "ASSET_ALLOCATION" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/asset-allocation/history" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/asset-allocation/history", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/asset-allocation/history", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/credit-quality/latest Latest Credit Quality Operation ID: get_latest_credit_quality Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | allocation_type | query | string | no | Default: "CREDIT_QUALITY" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/credit-quality/latest" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/credit-quality/latest", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/credit-quality/latest", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/credit-quality/history Credit Quality History Operation ID: get_credit_quality_history Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | | allocation_type | query | string | no | Default: "CREDIT_QUALITY" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/credit-quality/history" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/credit-quality/history", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/credit-quality/history", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/holdings/latest Latest Holdings Operation ID: get_latest_holdings Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/holdings/latest" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/holdings/latest", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/holdings/latest", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/holdings/history Holdings History Operation ID: get_holdings_history Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/holdings/history" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/holdings/history", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/holdings/history", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/sector-allocation/latest Latest Sector Allocation Operation ID: get_latest_sector_allocation Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | allocation_type | query | string | no | Default: "SECTOR_ALLOCATION" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/sector-allocation/latest" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/sector-allocation/latest", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/sector-allocation/latest", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/sector-allocation/history Sector Allocation History Operation ID: get_sector_allocation_history Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | | allocation_type | query | string | no | Default: "SECTOR_ALLOCATION" | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/sector-allocation/history" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/sector-allocation/history", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/sector-allocation/history", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/compliance/latest Latest Compliance Operation ID: get_latest_fund_compliance Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/compliance/latest" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/compliance/latest", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/compliance/latest", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/ratings/latest Latest Ratings Operation ID: get_latest_fund_ratings Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/ratings/latest" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/ratings/latest", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/ratings/latest", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/fees Fees Operation ID: get_fund_fees Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fees" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fees", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/fees", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/reported-returns Reported Returns Operation ID: get_fund_reported_returns Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/reported-returns" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/reported-returns", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/reported-returns", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/reported-metrics Reported Metrics Operation ID: get_fund_reported_metrics Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/reported-metrics" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/reported-metrics", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/reported-metrics", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/parties Parties Operation ID: get_fund_parties Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/parties" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/parties", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/parties", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/special-terms Special Terms Operation ID: get_fund_special_terms Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/special-terms" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/special-terms", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/special-terms", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/funds/{fund_slug}/notes Notes Operation ID: get_fund_report_notes Required scopes: fmr:read Weighted cost: 1 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | fund_slug | path | string | yes | No additional schema constraints published. | | from | query | string (date) | null | no | No additional schema constraints published. | | to | query | string (date) | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/notes" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/notes", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/funds/YOUR_FUND_SLUG/notes", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## GET /v1/mutual-funds/vps/{family_slug}/snapshot/latest Latest Vps Snapshot Operation ID: get_latest_vps_family_snapshot Required scopes: fmr:read Weighted cost: 3 units. | Parameter | Location | Type | Required | Constraints | | --- | --- | --- | --- | --- | | family_slug | path | string | yes | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request GET \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/vps/YOUR_FAMILY_SLUG/snapshot/latest" ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.get( "https://funds.api.ilovepsx.com/v1/mutual-funds/vps/YOUR_FAMILY_SLUG/snapshot/latest", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/vps/YOUR_FAMILY_SLUG/snapshot/latest", { method: "GET", headers: { "X-API-Key": key }, redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## POST /v1/mutual-funds/bulk/funds Bulk Funds Operation ID: post_bulk_mutual_funds Required scopes: funds:read Weighted cost: 2 units. ### JSON body | Field | Type | Required | Constraints | | --- | --- | --- | --- | | funds | string[] | yes | Minimum items: 1 | | fields | string[] | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request POST \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/funds" \ --header "Content-Type: application/json" \ --data '{"funds":["YOUR_FUND_SLUG"]}' ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.post( "https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/funds", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, json={"funds":["YOUR_FUND_SLUG"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/funds", { method: "POST", headers: { "X-API-Key": key, "Content-Type": "application/json" }, body: JSON.stringify({"funds":["YOUR_FUND_SLUG"]}), redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## POST /v1/mutual-funds/bulk/nav Bulk Nav Operation ID: post_bulk_mutual_fund_nav Required scopes: nav:read Weighted cost: 3 units. ### JSON body | Field | Type | Required | Constraints | | --- | --- | --- | --- | | funds | string[] | yes | Minimum items: 1 | | date | string (date) | null | no | No additional schema constraints published. | | date_policy | string | no | Default: "exact" | | from | string (date) | null | no | No additional schema constraints published. | | to | string (date) | null | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request POST \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/nav" \ --header "Content-Type: application/json" \ --data '{"funds":["YOUR_FUND_SLUG"]}' ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.post( "https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/nav", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, json={"funds":["YOUR_FUND_SLUG"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/nav", { method: "POST", headers: { "X-API-Key": key, "Content-Type": "application/json" }, body: JSON.stringify({"funds":["YOUR_FUND_SLUG"]}), redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## POST /v1/mutual-funds/bulk/snapshots Bulk Snapshots Operation ID: post_bulk_mutual_fund_snapshots Required scopes: fmr:read Weighted cost: 5 units. ### JSON body | Field | Type | Required | Constraints | | --- | --- | --- | --- | | funds | string[] | yes | Minimum items: 1 | | report_date | string (date) | null | no | No additional schema constraints published. | | latest | boolean | no | Default: true | | include | string[] | no | No additional schema constraints published. | ### cURL ```bash curl --fail-with-body --request POST \ --header "X-API-Key: $ILOVEPSX_API_KEY" \ "https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/snapshots" \ --header "Content-Type: application/json" \ --data '{"funds":["YOUR_FUND_SLUG"],"latest":true,"include":["profile","holdings","allocations"]}' ``` ### Python ```python # Install: python -m pip install httpx import os import httpx response = httpx.post( "https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/snapshots", headers={"X-API-Key": os.environ["ILOVEPSX_API_KEY"]}, json={"funds":["YOUR_FUND_SLUG"],"latest":True,"include":["profile","holdings","allocations"]}, timeout=30, follow_redirects=False, ) if response.status_code == 304: raise RuntimeError("Use your previously cached response") response.raise_for_status() payload = response.json() data, meta = payload["data"], payload["meta"] ``` ### JavaScript ```javascript // Run on your server with Node.js; keep the key out of browser code. const key = process.env.ILOVEPSX_API_KEY; if (!key) throw new Error("Set ILOVEPSX_API_KEY"); const response = await fetch("https://funds.api.ilovepsx.com/v1/mutual-funds/bulk/snapshots", { method: "POST", headers: { "X-API-Key": key, "Content-Type": "application/json" }, body: JSON.stringify({"funds":["YOUR_FUND_SLUG"],"latest":true,"include":["profile","holdings","allocations"]}), redirect: "error", signal: AbortSignal.timeout(30000), }); if (response.status === 304) throw new Error("Use your cached response"); const payload = await response.json(); if (!response.ok) throw new Error(payload.code + ": " + payload.detail); const { data, meta } = payload; ``` ### Responses - 200: Successful Response - 400: Invalid request - 401: Authentication required - 403: Insufficient permission - 404: Resource not found - 422: Validation failed - 429: Rate or quota limit exceeded - 500: Internal error - 503: Dependency unavailable Successful JSON uses { success: true, data, meta }. The data shape varies by endpoint; the OpenAPI SuccessEnvelope does not fully type dataset fields. Errors use application/problem+json. See the guide and labelled synthetic examples for data interpretation. ## Shared schemas ```json { "BulkIdentifiersRequest": { "properties": { "funds": { "items": { "type": "string" }, "type": "array", "minItems": 1, "title": "Funds" }, "fields": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "title": "Fields" } }, "additionalProperties": false, "type": "object", "required": [ "funds" ], "title": "BulkIdentifiersRequest" }, "BulkNAVRequest": { "properties": { "funds": { "items": { "type": "string" }, "type": "array", "minItems": 1, "title": "Funds" }, "date": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Date" }, "date_policy": { "type": "string", "title": "Date Policy", "default": "exact" }, "from": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "From" }, "to": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "To" } }, "additionalProperties": false, "type": "object", "required": [ "funds" ], "title": "BulkNAVRequest" }, "BulkSnapshotRequest": { "properties": { "funds": { "items": { "type": "string" }, "type": "array", "minItems": 1, "title": "Funds" }, "report_date": { "anyOf": [ { "type": "string", "format": "date" }, { "type": "null" } ], "title": "Report Date" }, "latest": { "type": "boolean", "title": "Latest", "default": true }, "include": { "items": { "type": "string" }, "type": "array", "title": "Include" } }, "additionalProperties": false, "type": "object", "required": [ "funds" ], "title": "BulkSnapshotRequest" }, "ProblemDetail": { "type": "object", "required": [ "type", "title", "status", "detail", "instance", "request_id", "code" ], "properties": { "type": { "type": "string", "format": "uri" }, "title": { "type": "string" }, "status": { "type": "integer" }, "detail": { "type": "string" }, "instance": { "type": "string" }, "request_id": { "type": "string" }, "code": { "type": "string" }, "errors": { "type": [ "array", "null" ], "items": { "type": "object", "additionalProperties": true } } } }, "SuccessEnvelope": { "type": "object", "required": [ "success", "data", "meta" ], "properties": { "success": { "type": "boolean", "const": true }, "data": {}, "meta": { "type": "object", "required": [ "request_id", "generated_at" ], "properties": { "request_id": { "type": "string" }, "generated_at": { "type": "string", "format": "date-time" }, "data_as_of": { "type": [ "string", "null" ], "format": "date" }, "data_freshness_days": { "type": [ "integer", "null" ] }, "page": { "type": [ "integer", "null" ] }, "per_page": { "type": [ "integer", "null" ] }, "total": { "type": [ "integer", "null" ] }, "total_pages": { "type": [ "integer", "null" ] }, "has_next": { "type": [ "boolean", "null" ] }, "has_previous": { "type": [ "boolean", "null" ] }, "next_cursor": { "type": [ "string", "null" ] }, "missing_funds": { "type": [ "array", "null" ], "items": { "type": "string" } } }, "additionalProperties": true } } } } ```