htag-intelligence — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited htag-intelligence (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are connected to the HtAG Analytics property intelligence platform. This skill teaches you how to use the HTAG MCP tools efficiently and interpret the data correctly.
Before calling any market endpoint, you must resolve the location. The user may ask about a suburb or an LGA (Local Government Area). Route accordingly:
| User says... | Examples | Lookup tool | Level parameter |
|---|---|---|---|
| A suburb name | "Paddington QLD", "Surfers Paradise", "Castle Hill NSW" | lookup_localities | "suburb" |
| An LGA / council name | "Brisbane City", "City of Moreland", "Blacktown LGA" | lookup_lgas | "lga" |
How to tell: LGAs typically include words like "City", "Council", "Shire", "Region", or "LGA". If the user just says a place name (e.g. "Paddington"), default to suburb.
Disambiguation rule: When a name matches both a suburb and an LGA (e.g. "Toowoomba" is both an LGA and maps to "Toowoomba City" suburb), always default to suburb. Do NOT deliberate, explain the ambiguity, or ask the user to clarify. Just pick the suburb and proceed. If the user wanted the LGA, they will say "LGA", "council", or "region" explicitly.
For suburbs — use the name parameter to search lookup_localities directly. Do NOT paginate or browse.
lookup_localities(name="Paddington", state_name="QLD")This returns an exact or near-exact match instantly. One call. Use the returned loc_pid (e.g., "QLD2303") as the area_id value in all market endpoints with level: "suburb".
For LGAs — call lookup_lgas. Only ~500 records, usually fits in one page. Use the returned lga_pid as area_id with level: "lga".
Always pass `state_name` as the abbreviation — "QLD", "NSW", "VIC", "SA", "WA", "TAS", "NT", "ACT". The API rejects full state names. If the user says "Queensland", "New South Wales", etc. — convert to the abbreviation before calling the API.
All market endpoints require:
area_id: array of loc_pid or lga_pid values (e.g., ["QLD2303"])level: either "suburb" (for suburb/locality queries) or "lga" (for LGA queries)property_type (optional): ["house"], ["unit"], or omit for bothProperty endpoints use address keys, not loc_pid:
standardise_addresses with the raw address to get the address_keyaddress_key in get_property_summary, get_property_estimates, get_property_marketsearch_sold_properties searches by location criteria. Use this for comparable sales analysis.
Best for "What's the market like in [suburb]?"
Step 1 (sequential): lookup_localities (name + state_name) → get loc_pid
Step 2 (ALL IN PARALLEL): Fire these simultaneously in a single batch:
- get_market_summary (area_id=[loc_pid], level="suburb")
- get_market_scores (area_id=[loc_pid], level="suburb")
- get_market_cycle (area_id=[loc_pid], level="suburb")
- get_market_supply (area_id=[loc_pid], level="suburb")
- get_market_demand (area_id=[loc_pid], level="suburb")
- get_market_fundamentals (area_id=[loc_pid], level="suburb")IMPORTANT: After obtaining the area_id, call ALL market endpoints simultaneously in one batch. Do NOT call them one at a time sequentially. This applies to every pattern below — always batch market calls after the lookup step.
Present results in sections: Pricing & Yield → Scores → Market Cycle → Supply → Demand → Takeaway.
Best for "How much is [address] worth?"
Step 1 (sequential): standardise_addresses(addresses=["full address string"]) → get address_key
Step 2 (ALL IN PARALLEL): Fire these simultaneously in a single batch:
- get_property_summary(address_key=X) → beds, baths, parking, land size, floor area, build date
- get_property_estimates(address_key=X, cma_method="IA") → index-adjusted value estimate
- get_property_market(address_key=X) → rental %, years to own, hold period, ownership status
Step 3 (sequential): lookup_localities(name=suburb, state_name=state) → get loc_pid
Step 4 (ALL IN PARALLEL): Fire suburb context endpoints:
- get_market_summary(area_id=[loc_pid], level="suburb") → typical price for comparison
- get_market_scores(area_id=[loc_pid], level="suburb") → RCS scores#### Understanding the Index-Adjusted (IA) Estimate
The get_property_estimates endpoint uses Index-Adjusted methodology — NOT an AVM. Never call it an "AVM" or "automated valuation model". The IA method works by:
Response fields:
| Field | Meaning |
|---|---|
price_estimate | IA-adjusted current value estimate (null if insufficient data) |
rent_estimate | Estimated current weekly rent (null if no rental history) |
last_sold_date | Date of most recent sale |
last_sold_price | Price at most recent sale |
last_rented_date | Date of most recent rental listing |
last_rented_price | Weekly rent at most recent listing |
#### Handling null price_estimate
price_estimate returns null in two cases:
When price_estimate is null, do NOT say "no estimate available" and give up. Instead:
last_sold_price and last_sold_date if they exist (e.g. "Last sold for $245,000 in April 2001")typical_price from get_market_summary as the primary market referenceget_property_summary attributes (beds, baths, land size) to qualify whether it sits above or below typicalNever fall back to suburb data silently. Always explain what data was and wasn't available at the property level.
Best for "How have prices/vacancy/supply changed over time?"
1. lookup_localities → get loc_pid
2. get_market_trends_price / rent / yield / vacancy / stock_on_market etc.Time-series endpoints return monthly or quarterly data points. Present as direction + magnitude, not raw data dumps.
Best for "Is supply tightening?" or "What's demand like?"
1. lookup_localities → get loc_pid
2. get_market_supply → current SoM%, inventory months, BA ratio, hold period
3. get_market_supply_ls + get_market_supply_ss → long-term and short-term supply trends
4. get_market_demand → DoM, vacancy, clearance rate, search index
5. get_market_demand_ls + get_market_demand_ss → long-term and short-term demand trendsBest for "What are the risks for [suburb/property]?"
1. get_market_risk → flood index, bushfire index, EDI, MADI, distance to GPO
2. get_address_environment → property-level flood, bushfire, heritage, zoning
3. get_market_fundamentals → IRSAD, RO ratio, affordabilityHtAG's proprietary alternative to median price. Uses machine learning to fit data across the full historical period, prioritising the most recent month. More resilient to outliers and compositional bias than rolling medians. Reported independently for houses and units.
(annual rent / typical price) × 100. Because typical price is more current than median price, HtAG yield is closer to real-time than other providers.
Returned by get_market_scores. Each is a relative score from 1–100, calculated from 80+ metrics. Independently calculated for houses and units.
| Score | What It Measures |
|---|---|
| Capital Growth | Composite of all growth-related metrics + 30 additional factors |
| Cashflow | Yield, rent, vacancy, and cashflow-related metrics |
| Lower Risk | Risk-weighted score. Higher = lower risk |
| Overall | Average of Capital Growth, Cashflow, and Lower Risk |
Momentum indicator showing year-on-year price change direction. Combines sign (+/-) with phase:
| Notation | Meaning | Signal |
|---|---|---|
| (+) Peak | Growth this year > previous & next year | Neutral |
| (+) Increasing | Growth rate accelerating | Opportune |
| (+) Decreasing | Growth rate decelerating | Neutral |
| (+) Trough | Growth this year < previous & next year | Opportune |
| (-) Increasing | Decline slowing | Opportune |
| (-) Trough | Maximum decline reached | Opportune |
| (-) Decreasing | Decline accelerating | Unfavourable |
| (-) Peak | Rare | Unfavourable |
IMPORTANT: GRC should never be used in isolation. It represents rate of change and fluctuates between releases. Always combine with fundamentals, supply, and demand.
Counts months with positive yearly growth minus months with negative growth. Higher = more consistent positive growth. Returned by get_market_cycle.
Lowest historical yearly growth rate ever recorded. Higher values = less severe worst-case. Returned by get_market_cycle.
Fields: gpd_3, gpd_5, gpd_10. Difference between recent growth (3/5/10 years) and long-term historical average.
Fields: gsp_3, gsp_5, gsp_10. Compares suburb growth to broader LGA growth over same periods.
Scale 1–10. Measures deviation of short-term price growth from long-term trend.
| Field | Meaning |
|---|---|
| Projected Annual Capital Growth (Low/High) | Range of % difference between projected typical price and long-term trend |
| Projected Annual ROI (Low/High) | Gross yield + capital growth projection |
| Projected Annual Rent Increase | Estimated annual rent growth from long-term trend |
Projections illustrate the "reversion to the mean" outcome. They help determine where a market sits in its growth cycle.
Index of Relative Socio-economic Advantage and Disadvantage (ABS/SEIFA). Published every 5 years.
| Unfavourable | Neutral | Opportune |
|---|---|---|
| Decile 1–2 | Decile 3–8 | Decile 9–10 |
Lower IRSAD should NOT be automatically discarded — these areas can offer strong investment opportunities at lower price points.
Proportion of renter households to owner-occupier/mortgagee households.
| Unfavourable | Neutral | Opportune |
|---|---|---|
| >45% | 15–45% | <15% |
Assumes 50% of household income to repayments, 80% LVR, current cash rate + 2% buffer, 30-year mortgage. Values >30 years indicate decreased affordability.
Scale 1–100 (Modified Shannon-Wiener). Higher = more diverse economy. Bottom score is ~40, so small differences are significant. Industries weighted by socio-economic standing.
Mining & Agriculture Dominance. Scale 0–100. Higher = less mining/agriculture = better for long-term buy-and-hold. Always pair MAD with EDI.
SoM as a ratio of total dwellings. HTAG counts only NEW listings per period — listings are NOT carried forward.
| Low Supply | Balanced | High Supply |
|---|---|---|
| <0.4% | 0.4–1.3% | >1.3% |
SoM ÷ average monthly sales over past 12 months.
| Low Supply | Balanced | High Supply |
|---|---|---|
| <2.1 months | 2.1–4.5 months | >4.5 months |
Approvals ÷ total dwellings.
| Low Supply | Balanced | High Supply |
|---|---|---|
| <0.3% | 0.3–2% | >2% |
Average time between consecutive sales. Measured in years.
| Tightly Held | Balanced | High Turnover |
|---|---|---|
| >10.4 years | 6.4–10.4 years | <6.4 years |
Median days listings remain active. Rolling month, 3-month average.
| Low Demand | Balanced | High Demand |
|---|---|---|
| >90 days | 35–90 days | 0–35 days |
Vacant rentals (>21 days listed) ÷ total rental dwellings × 100. A value of -1.00% means vacancy cannot be calculated — use Days on Rental Market (DoRM) instead.
| Low Demand | Balanced | High Demand |
|---|---|---|
| >3.5% | 1–3.5% | <1% |
0% can mean no auctions occurred (not necessarily low demand).
| Low Demand | Balanced | High Demand |
|---|---|---|
| <50% | 50–70% | >70% |
Ratio of online searches to state average. Value of 5 = at average.
| Low | Balanced | High |
|---|---|---|
| 0–2 | 3–5 | 6–10 |
Available via _ls and _ss suffix endpoints for supply and demand metrics. Slopes quantify trend direction and speed using linear regression.
| Slope Type | Calculation Period |
|---|---|
| Long-term (LS) | Entire metric duration |
| Short-term (SS) — monthly/quarterly | 13 months |
| Short-term (SS) — yearly metrics | 3 years |
When LS/SS contradicts a visual chart trendline: trust the LS/SS values. Sporadic data produces misleading visual trendlines; the regression model is more accurate.
get_property_estimates returns price_estimate: null if a property has never transacted or the sale is too old for reliable index adjustment.Do NOT report nulls as errors. Explain what they mean in context. For property estimates specifically, see Pattern 2 above for the full null-handling workflow — never say "no AVM available" or silently fall back to suburb data.
HTAG reports for two types only:
| Type | Includes | Excludes |
|---|---|---|
| Houses | Freestanding houses | Townhouses, villas, duplexes |
| Units | Apartments, studios, flats | Unit blocks, townhouses |
Semi-detached (townhouses, villas, duplexes) are excluded from both. Use house data as a proxy for townhouses — multiply typical price by ~0.8 for a rough estimate.
Always query with default (all bedrooms) as baseline. Bedroom-specific data (1–5 beds) is available where transaction volume supports it, but many suburbs have gaps. Request "all" first, then layer bedroom-specific data if needed.
When presenting HTAG data to users:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.