# 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
      }
    }
  }
}
```
