# ASX LIC & LIT Discount to NTA Screener (`mrdoe/asx-lic-discount-screener`) Actor

Australian listed investment companies and trusts (AFI, ARG, BKI, MIR, PIC and more) ranked by discount or premium to net tangible assets, from ASX prices and the latest NTA announcements. Staleness flags included.

- **URL**: https://apify.com/mrdoe/asx-lic-discount-screener.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![ASX LIC & LIT Discount to NTA Screener - ASX listed investment company discount to NTA screener showing price, NTA per share and discount percent](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/asx-lic-discount-screener--hero.png)

### What does ASX LIC & LIT Discount to NTA Screener do?

ASX LIC Discount Screener returns, for each Australian listed investment company (LIC) and listed investment trust (LIT), the current ASX share price, the latest net tangible assets (NTA) per share the vehicle announced to the ASX, and the resulting discount or premium in percent. Rows are sorted from the deepest discount, and each carries the date of the NTA, its age in days, whether it is stale, and whether the figure is pre-tax or post-tax. About 65 vehicles are covered, including AFI, ARG, BKI, MIR, PIC, PL8, PGF, DJW, CAM and WQG. Vehicles whose NTA could not be read are listed separately with the reason, never guessed.

### Why use ASX LIC & LIT Discount to NTA Screener?

- Answers the question LIC investors ask every week: which vehicles trade below the value of their assets, and by how much.
- Reads the NTA the vehicle itself announced to the ASX, next to the live ASX price, so both sides are official.
- Freshness built in: every row says how old the NTA is and flags it as stale, so a monthly NTA is never mistaken for a live one.
- Honest gaps: vehicles whose figure cannot be read confidently are reported with a reason, not filled with a guess.
- Screen-ready: sorted by discount, with a minimum-discount filter and delta mode that returns only newly published NTAs.

### What makes this different

Broker and data terminals hide LIC discount tables behind a subscription, and free sites show a stale figure with no date. This Actor gives you the vehicle's own announced NTA with its date and age, checked against the share price for plausibility, so you can build a discount screen, alerts or a model without a data contract.

### Who can use the ASX LIC Discount Screener and how?

- **Self-directed investors:** screen for LICs trading at a discount to NTA and track how discounts change.
- **Financial advisers and research houses:** add an LIC discount table to client notes and reports.
- **Quant and systematic investors:** build discount mean-reversion and NTA-arbitrage signals from a clean, dated dataset.
- **Finance newsletters and bloggers:** publish a weekly discount league table.
- **Fund managers and IR teams:** benchmark their vehicle's discount against peers.
- **Fintech and portfolio apps:** show price versus NTA for listed funds.
- **AI agent builders:** let an assistant answer which LICs trade below NTA today.
- **Researchers:** study discount persistence and buy-back effects over time.

### How it works

![ASX LIC & LIT Discount to NTA Screener workflow: your input, collection, output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/asx-lic-discount-screener--how-it-works.png)

1. **Your input** — choose vehicle codes, or leave empty for the full universe.
2. **The Actor collects it** — the Actor reads each vehicle's ASX price and its latest NTA announcement and works out the discount.
3. **Your output** — you get rows sorted by discount, with dates, freshness flags and a list of vehicles that could not be read.

### What data can you extract?

The dataset has 23 fields per row:

| Field                  | Type    | Description                                                 |
| ---------------------- | ------- | ----------------------------------------------------------- |
| `code`                 | string  | ASX code.                                                   |
| `name`                 | string  | Vehicle name.                                               |
| `price_aud`            | number  | Last ASX price in dollars.                                  |
| `market_cap_aud`       | number  | Market capitalisation in dollars.                           |
| `nta_per_share_aud`    | number  | Net tangible assets per share in dollars, as announced.     |
| `premium_discount_pct` | number  | Negative = discount to NTA, positive = premium, in percent. |
| `valuation`            | string  | discount, near_nta or premium (5% bands).                   |
| `nta_basis`            | string  | post_tax, pre_tax or unlabelled.                            |
| `pre_tax_nta_aud`      | number  | Pre-tax NTA per share when published.                       |
| `post_tax_nta_aud`     | number  | Post-tax NTA per share when published.                      |
| `nta_as_at`            | string  | Date the NTA relates to.                                    |
| `nta_announced`        | string  | Date the NTA was announced to the ASX.                      |
| `nta_age_days`         | integer | Days since the NTA date.                                    |
| `is_stale`             | boolean | True when the NTA is older than the stale limit.            |
| `stale_after_days`     | integer | The stale limit used.                                       |
| `nta_headline`         | string  | Title of the ASX announcement the NTA was read from.        |
| `status`               | string  | ok, or why the NTA could not be read.                       |
| `note`                 | string  | Explanation when not ok.                                    |
| `announcements_url`    | string  | The vehicle's ASX announcements page.                       |
| `fetch_path`           | string  | How the data was obtained.                                  |
| `source`               | string  | Data source.                                                |
| `scraped_at`           | string  | Timestamp.                                                  |
| `actor_version`        | string  | Actor version.                                              |

### How to use ASX LIC & LIT Discount to NTA Screener

![ASX LIC & LIT Discount to NTA Screener input form](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/asx-lic-discount-screener--input.png)

1. Open the Actor and go to the **Input** tab.
2. Leave **Vehicle codes** empty to screen the whole universe, or list codes such as `AFI`, `ARG`, `BKI`. Set **Minimum discount** to keep only vehicles trading at least that far below NTA. Turn on **Only newly published NTAs** with a delta key and schedule the run to get alerts when a vehicle publishes new NTA.
3. Optionally set filters and a **Max results** limit.
4. Click **Start**. A default run finishes in under a minute.
5. Open the **Output** tab, then download the dataset or connect it to your tools.

### Input Parameters

| Parameter            | Type    | Required | Default                   | Description                                                                                                                                  |
| -------------------- | ------- | -------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `codes`              | array   | No       | `[]`                      | ASX codes of listed investment companies or trusts, for example AFI, ARG, BKI. Leave empty to screen the whole universe (about 65 vehicles). |
| `minDiscountPct`     | number  | No       | —                         | Keep only vehicles trading at least this many percent below NTA. Leave empty for no filter.                                                  |
| `onlyWithNta`        | boolean | No       | `true`                    | When on, vehicles whose NTA could not be read are not returned or billed (they are listed in the NOT_READ record instead).                   |
| `staleDays`          | integer | No       | `14`                      | An NTA older than this many days is flagged stale.                                                                                           |
| `maxItems`           | integer | No       | `100`                     | Overall cap on returned vehicles. Set 0 for no limit.                                                                                        |
| `deltaMode`          | boolean | No       | `false`                   | After the first run with a delta key, return and bill only vehicles that published a new NTA.                                                |
| `deltaStateKey`      | string  | No       | `"default"`               | Name of the tracked stream.                                                                                                                  |
| `proxyConfiguration` | object  | No       | `{"useApifyProxy":false}` | Optional proxy. ASX data works without one.                                                                                                  |

### Output Data

![ASX LIC & LIT Discount to NTA Screener dataset table](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/asx-lic-discount-screener--output.png)

`premium_discount_pct` is negative for a discount and positive for a premium: (price - NTA) / NTA. `valuation` is discount, near_nta or premium (5% bands). `nta_basis` says whether the figure is post_tax, pre_tax or unlabelled; when both are published they are also given as `post_tax_nta_aud` and `pre_tax_nta_aud`. `nta_as_at`, `nta_age_days` and `is_stale` describe freshness. Vehicles that could not be read appear only when **Only vehicles with a readable NTA** is off, with `status` and `note`.

![ASX LIC & LIT Discount to NTA Screener field map of one record](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/asx-lic-discount-screener--fields.png)

A real dataset item:

```json
{
    "code": "CD2",
    "name": "CD PRIVATE EQUITY FUND II",
    "price_aud": 0.26,
    "market_cap_aud": 13644562,
    "announcements_url": "https://www.asx.com.au/markets/trade-our-cash-market/announcements.cd2",
    "nta_headline": "Net Tangible Asset Backing & Fund Update",
    "nta_announced": "2026-09-14",
    "nta_as_at": "2026-08-31",
    "nta_age_days": 26,
    "status": "ok",
    "nta_basis": "post_tax",
    "nta_per_share_aud": 0.581,
    "premium_discount_pct": -55.25,
    "valuation": "discount",
    "is_stale": true,
    "stale_after_days": 14,
    "pre_tax_nta_aud": 0.67,
    "post_tax_nta_aud": 0.581,
    "fetch_path": "asx_announcement_pdf",
    "source": "asx_announcements_and_prices",
    "scraped_at": "2026-09-26T17:49:46.570Z",
    "actor_version": "1.0.0"
}
```

### How to read and use the results

1. **Sort by premium_discount_pct** to see deepest discounts first.
2. **Check is_stale and nta_age_days** before trusting a discount.
3. **Compare nta_basis**: post-tax is the conservative comparison.
4. **Use valuation** for a quick discount, near_nta, premium split.
5. **Schedule with delta mode** to catch newly published NTAs.
6. **Review NOT_READ** in the key-value store for vehicles that could not be read.

### Usage Examples

#### Whole universe, deepest discounts first

```json
{
    "maxItems": 0
}
```

#### Big domestic LICs

```json
{
    "codes": ["AFI", "ARG", "BKI", "MIR", "DJW", "PIC", "PL8", "CAM"],
    "maxItems": 0
}
```

#### At least 10% below NTA, fresh NTAs only

```json
{
    "minDiscountPct": 10,
    "staleDays": 10,
    "maxItems": 0
}
```

### Tips for Best Results

- Sort or filter on premium_discount_pct; deep discounts on stale NTAs are often a data artefact, so check is_stale first.
- Post-tax NTA is used when published, since it is what most investors compare against; the pre-tax figure is also returned.
- Schedule weekly with delta mode to be told when a vehicle publishes a new NTA.
- Turn off Only vehicles with a readable NTA to audit which vehicles could not be read and why.
- Discounts on trusts investing in credit or infrastructure can persist for structural reasons; the discount alone is not a buy signal.
- Default is 5 results for a fast test. Set the max to 0 to return everything available.

### Reliability by mode

| Mode                                                  | Status | Needs login or key? | Notes                                            |
| ----------------------------------------------------- | ------ | ------------------- | ------------------------------------------------ |
| Large domestic LICs (AFI, ARG, BKI, MIR)              | ✅     | No                  | NTA read from their ASX announcements.           |
| Most other LICs and LITs                              | 🟡     | No                  | Read when the announcement layout is recognised. |
| Vehicles announcing NTA in image-only PDFs            | ❌     | -                   | Listed as not read.                              |
| Vehicles with no NTA in the latest five announcements | 🟡     | -                   | Listed as no_nta_announcement.                   |
| Live intraday premium                                 | ❌     | -                   | Uses last trade and the latest announced NTA.    |

✅ works as described, 🟡 works with caveats, ❌ not supported.

### Only new records (delta mode)

Turn on **Only newly published NTAs (delta mode)** and set a **Delta key**. The first run returns every readable vehicle; later runs return, and bill, only vehicles that published a new NTA.

### Known Limitations

- Only the latest five ASX announcements of each vehicle are visible, so a vehicle that has just released several other announcements can temporarily show no NTA.
- Some vehicles publish NTA inside another report, as images, or with layouts the Actor cannot read confidently; they are listed as not read with the reason.
- NTA is often monthly, so the discount uses an NTA that may be weeks old; check nta_age_days and is_stale.
- The share price is the last ASX trade, delayed and not a live quote.
- Coverage is a curated list of about 65 ASX LICs and LITs, not every ASX-listed fund.
- This is information, not financial advice.

### Integrations

Run it from the Apify API, on a schedule, or from a webhook. Send results straight to Google Sheets, Make, Zapier, Slack or your own database with Apify's built-in integrations.

### Export Formats

Download the dataset as JSON, CSV, Excel, XML, HTML table or RSS from the **Output** tab or the API.

### Frequently Asked Questions

#### Where does the data come from?

The share price and the vehicle's own NTA announcements to the ASX, which are public.

#### What does a negative discount mean?

A negative number means the shares trade below NTA (a discount); positive means above (a premium).

#### Why does a vehicle show no NTA?

Either it announces NTA inside another report, or the latest announcements do not include one, or the document could not be read confidently. The reason is in the status field.

#### Is post-tax or pre-tax used?

Post-tax NTA when published, otherwise pre-tax. Both are returned when available.

#### Does it need an API key or account?

No.

#### Am I charged for vehicles that could not be read?

Not by default. Unreadable vehicles are not returned unless you turn the option off.

#### Do I need an account or login?

No. The Actor reads public ASX prices and announcements and needs no account or API key.

#### Am I charged for failed runs or empty results?

You are only charged for results that are actually written to the dataset.

#### Can I run it on a schedule?

Yes. Create a Task with your input and add a schedule in Apify Console. With monitor mode on, each scheduled run returns only what changed since the previous one.

### Changelog

- **2026-09-26:** First release: about 65 ASX LICs and LITs with price, NTA per share, discount and freshness flags.

### Enterprise and custom work

Need higher volumes, a custom output schema, dedicated scheduling or a no-breaking-changes commitment for a production pipeline? Open an issue on the Actor page and describe your use case. Bulk terms and custom builds are available.

### Support

Questions or a missing field? Open an issue from the **Issues** tab on this Actor's page and it will be looked at.

### Legal / Responsible Use

This Actor reads public ASX market data and announcements. You are responsible for how you use the data. It is not financial advice and not affiliated with the ASX or any fund manager.

# Actor input Schema

## `codes` (type: `array`):

ASX codes of listed investment companies or trusts, for example AFI, ARG, BKI. Leave empty to screen the whole universe (about 65 vehicles).

## `minDiscountPct` (type: `number`):

Keep only vehicles trading at least this many percent below NTA. Leave empty for no filter.

## `onlyWithNta` (type: `boolean`):

When on, vehicles whose NTA could not be read are not returned or billed (they are listed in the NOT_READ record instead).

## `staleDays` (type: `integer`):

An NTA older than this many days is flagged stale.

## `maxItems` (type: `integer`):

Overall cap on returned vehicles. Set 0 for no limit.

## `deltaMode` (type: `boolean`):

After the first run with a delta key, return and bill only vehicles that published a new NTA.

## `deltaStateKey` (type: `string`):

Name of the tracked stream.

## `proxyConfiguration` (type: `object`):

Optional proxy. ASX data works without one.

## Actor input object example

```json
{
  "codes": [],
  "onlyWithNta": true,
  "staleDays": 14,
  "maxItems": 100,
  "deltaMode": false,
  "deltaStateKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "codes": [],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/asx-lic-discount-screener").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "codes": [],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/asx-lic-discount-screener").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "codes": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call mrdoe/asx-lic-discount-screener --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/asx-lic-discount-screener"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Gv05FSank2lnbidlK/builds/rrOuB5VggjzCTHD6x/openapi.json
