Service Overview

Harcourt Valuations produces institutional-grade Net Asset Value (NAV) reports for mining companies. Each report contains an asset-by-asset discounted cash flow (DCF) valuation, a P/NAV ratio, and selected sensitivity analysis. The models themselves, and the methods behind them, are not distributed.

The core thesis: the answer is a number. Mining equity analysis should produce a specific, defensible per-share value — not a narrative. P/NAV (price to net asset value) is the primary metric used by mining-focused fund managers and sell-side analysts at major Canadian and Australian banks.

Products

Which of these an agent can buy. Only the $1 NAV Query. It settles per call through Qatom and needs no human. It needs a key that Harcourt issues to Qatom and Qatom holds server-side; a paid call arriving without one is refused with 402 payment_required. The $15 report and the $5 and $9 passes are bought by a person, by card, on the site. Subscriptions and adviser seats are card payments through Stripe. Point a human at harcourtvaluations.ai/pricing/ rather than attempting any of these.

Free access

Covered Companies

This page does not hard-code the coverage list. Coverage changes as models are completed, and any list written here would drift from the source. The live sources are:

EndpointAnswers
GET https://harcourtvaluations.ai/llms.txt The coverage table: every covered company with its listings, API ticker, accepted inputs, NAV currency and company page. Regenerated on every publish.
GET https://harcourtvaluations.ai/company/ Coverage index, HTML or JSON: every company with its API ticker, NAV, P/NAV, model date and page URL.
GET https://harcourtvaluations.ai/company/{slug} Per-company record, HTML or JSON (Accept: application/json): api_ticker, Published NAV, share price, P/NAV and model date.

Resolving a company to its API ticker. Every covered company has one API ticker (Seabridge Gold is sa, Integra Resources is itrg). The API also accepts any listing symbol the company trades under, with or without an exchange prefix or suffix — SEA, TSX:SEA, SEA.TO, ITR.V, DYL.AX, IVPAF — and the Qatom tool does the same. A bare symbol shared by two covered companies returns 400 ambiguous_ticker with the candidates. The coverage table in llms.txt maps each listing to its API ticker.

Determining supported valuation inputs. NAV Query responses and error bodies are self-describing. A successful response identifies the inputs used and any Harcourt defaults applied; an invalid parameter response identifies the supported parameters for that ticker.

NAV Query API

The NAV Query API returns a Harcourt NAV per share for a covered company. What the request asks for decides whether it is free:

The product is the right to change the question. The published answer is reached by not asking one.

Every answer comes from that company's own full model run, so material non-linear effects — taxation above all — are preserved across the supported range. Harcourt does not distribute the models, the code behind them, or the methods used to value between supported points.

Endpoint

GET https://reports.harcourtvaluations.ai/nav-query/{ticker}

The ticker may also travel as a parameter — GET /nav-query?ticker=hl — which is how one marketplace tool serves every covered company. Either form accepts the API ticker or any listing symbol.

Paying for a paid call

A paid call carries a key Harcourt issues. Agents do not hold one directly: the Qatom tool holds it server-side and adds it to the call, so the price settles from the agent's wallet and the key never reaches the caller. Without a valid key, a paid call returns 402 and a body naming both routes:

{
  "error":    "payment_required",
  "reason":   "no_key",
  "ticker":   "HL",
  "message":  "The published NAV is free: call this endpoint with no inputs. ...",
  "free_url": "https://reports.harcourtvaluations.ai/nav-query/hl",
  "machine":  { "via": "Qatom", "tool": "harcourt_mining_nav_query", "price_usd": 1, "per": "call",
                "mcp_server": "https://harcourt-valuations-qxvs.mcp.m.todaq.net/mcp" },
  "browser":  { "pass_usd": 5, "hours": 6, "scope": "one company",
                "buy_url": "https://harcourtvaluations.ai/pricing/" }
}

An agent should follow machine. The $5 and $9 passes are browser products: a key bought there works only from Harcourt's own pages, and anywhere else is refused with reason: "site_only_key".

Parameters

ParameterTypeDescriptionApplies to
gold / aunumberGold price per troy oz (e.g. 4000)Companies whose model prices gold
silver / agnumberSilver price per troy oz (e.g. 61)Companies whose model prices silver
cu / coppernumberCopper price per lb (e.g. 6.5)Companies whose model prices copper
zn / zincnumberZinc price per lb (e.g. 1.62)Companies whose model prices zinc
u3o8numberUranium price per lb U3O8 (e.g. 82)Companies whose model prices uranium
pgm4enumber4E PGM basket price per ozCompanies whose model prices a 4E basket
sbnumberAntimony price per lbCompanies whose model prices antimony
ratenumberDiscount rate as a decimal (0.08 = 8%). Omitted, the model's own base rate is used and reported in defaulted_inputs.All
deckstringpublished (the default, free) or closing (paid). Decides where any input the caller does not supply comes from.All

This table names the parameter families. Which of them a given company accepts is answered by the free call itself: the axes array in every response names each input and the parameter names it answers to. Discover rather than guess. A parameter naming an input the company does not price is refused with wrong_axis_param; a parameter the API does not recognise at all is ignored, so check inputs to confirm what was used.

Prices are not always in US dollars. A model reporting in Canadian dollars prices gold in Canadian dollars, and names that input gold_cad_per_oz — while the parameter is still gold. Read the input name from axes before sending a price. A US dollar gold price sent to a Canadian dollar input is a valid number in the wrong currency and will not be refused.

Response shape

{
  "ticker":             "HL",
  "alias":              { "requested": "HL.US", "resolved": "HL", "note": "..." },  // only when a listing symbol was sent
  "valuation_type":     "published | closing | scenario",
  "deck":               "published | closing",
  "access":             { "mode": "free | key", "kind": "qatom" },
  "priced_at":          null,                 // date of the closing prices used, else null
  "model_date":         "2026-08-30",
  "inputs":             { "silver_usd_per_oz": 65, "discount_rate": 0.08 },
  "defaulted_inputs":   { "silver_usd_per_oz": { "value": 65, "source": "model_deck" } },
  "axes":               [ { "axis": "silver_usd_per_oz", "accepts": ["silver", "ag"] } ],
  "nav_per_share":      7.53,
  "currency":           "USD",
  "nav_per_share_usd":  7.53,                 // the same figure, keyed by its currency
  "out_of_grid":        false,
  "out_of_grid_detail": null,
  "disclaimer":         "For informational purposes only. Not investment advice."
}

The response carries no share price and no P/NAV. Both are free elsewhere: on the coverage record at GET https://harcourtvaluations.ai/company/{slug} with Accept: application/json, and from the free MCP server below.

nav_per_share always travels with an explicit currency. Never infer the currency from the commodity, the exchange or the listing.

defaulted_inputs names every value the caller did not supply and where it came from: model_deck (the model's own price deck) or closing (the latest close, dated in as_of). A result is therefore auditable without Harcourt publishing anything about the model behind it.

Example calls

# Published NAV — free, no key
GET /nav-query/hl

# Closing NAV — paid
GET /nav-query/hl?deck=closing

# Scenario NAV — paid; anything not named comes from the model's own deck
GET /nav-query/hl?silver=70&rate=0.10

# Scenario NAV — paid; anything not named comes from the latest close
GET /nav-query/hl?silver=70&deck=closing

Substitute any API ticker or listing symbol from the coverage table in llms.txt. Call the free form first: it costs nothing, and its axes array states exactly what that company accepts. Agents buy the paid forms through the Qatom tool below rather than over plain HTTP.

Values outside the supported range

An input beyond the range Harcourt supports for that company is held at the nearest supported value rather than extrapolated, and the response says so: out_of_grid becomes true and out_of_grid_detail names each input concerned with its direction, "above" or "below". Such an answer is a boundary estimate, not a valuation at the value supplied, and the disclaimer says so.

Supported ranges, as published on the Qatom tool (US dollars): gold 2,650–5,950/oz, silver 48–79/oz, copper 5.35–8.15/lb, zinc 1.50–2.30/lb, U3O8 47.5–124.5/lb, 4E PGM 1,175–3,090/oz, antimony 5.35–14.00/lb, discount rate 0.05–0.15. Whatever the range, check out_of_grid on the answer.

Error responses

HTTPerrorMeaning
400ticker_requiredNo ticker in the path or the query string.
404ticker_not_foundNo covered company matches the ticker or listing symbol. The body carries coverage_url, the llms.txt coverage table.
400ambiguous_tickerA bare listing symbol belongs to more than one covered company. The body lists the candidates; send the API ticker or an exchange-qualified symbol.
400wrong_axis_paramA parameter that company does not price. The body names what it does accept.
400ambiguous_axis_paramTwo parameters for one input, or row where the company prices several commodities.
400bad_deckdeck was neither published nor closing.
402payment_requiredA paid call without a valid key. reason carries the detail: no_key, unknown_key, expired, revoked, wrong_company, site_only_key.
404no_sensitivity_matrixCovered, but cannot yet answer a query. The report is still available.
500malformed_gridHarcourt's problem, not the caller's. Please report it.

Every 400 body can be acted on without re-reading this page: it names the inputs that company accepts, the parameter names for each, and where applicable the exact parameter to substitute.

Listing symbols are permanent aliases. When a call uses a listing symbol rather than the API ticker, the response answers for the company and carries an alias block naming both, for example "SEA.TO is a listing symbol for SA. Both work; the API ticker is sa." Nothing needs changing in the integration.

Harcourt MCP — Free, No Account

Harcourt runs its own MCP server. Streamable HTTP, no authentication, no account. Add it as a custom connector in any MCP-capable client:

https://mcp.harcourtvaluations.ai/mcp

Tools

Scenario NAV and Closing NAV are deliberately not on this server. A valuation at caller-supplied prices, or at today's close, is the paid product — use the Qatom tool below. The free connector cannot be used to obtain the paid answer.

Rate limits

Per caller per day: 400 published-NAV lookups, 40 Mike questions. A refusal states the limit it reached. The server reports its own limits at GET https://mcp.harcourtvaluations.ai/, which also confirms whether metering is active.

Qatom MCP — Paid, Settled Per Call

AI agents that have been granted access to the Qatom MCP marketplace can discover and call the Harcourt NAV Query autonomously, with payment settled automatically from the agent's Qatom wallet. No human approval is required per transaction. It is the only Harcourt item on Qatom; reports are not sold to agents.

NAV Query tool

FieldValue
Tool nameharcourt_mining_nav_query (listed as “Harcourt Mining NAV Query”)
Price$1 USD TDN per call
MCP serverhttps://harcourt-valuations-qxvs.mcp.m.todaq.net/mcp
DiscoveryAvailable in Qatom MCP marketplace — search by tool name or by intent

Tool input schema

{
  "ticker":  "dpm",    // required: API ticker or listing symbol
  "gold":    5500,     // optional, USD/oz    2650–5950
  "silver":  70,       // optional, USD/oz    48–79
  "cu":      7.5,      // optional, USD/lb    5.35–8.15
  "zn":      1.9,      // optional, USD/lb    1.50–2.30
  "u3o8":    85,       // optional, USD/lb    47.5–124.5
  "pgm4e":   2000,     // optional, USD/oz    1175–3090
  "sb":      9,        // optional, USD/lb    5.35–14.00
  "rate":    0.10      // optional, decimal   0.05–0.15
}

Send only the inputs the company accepts: the coverage table, or the free HTTP call's axes array, says which.

The tool is priced per call and always returns a paid valuation: it carries deck=closing, so a call naming only a ticker returns the Closing NAV, and any supplied price or rate returns a Scenario NAV with the close used for whatever was not supplied.

Agent wallet setup

To call Qatom-gated tools autonomously, an agent needs:

  1. A Qatom primary wallet (human-controlled, MFA-gated) — created at todaq.net
  2. An agent sandbox wallet (no MFA, funded from the primary wallet via transfer_to_agent_wallet)
  3. Sufficient TDN balance to cover the calls ($1 per NAV query)

The agent sandbox wallet is debited when the call is placed. Revenue is credited to Harcourt's provider Twin in real time.

Free Chat API (Klondike Mike)

A free conversational interface to Harcourt's data. Returns plain-language NAV analysis for any covered ticker. No payment required. Useful for quick screening before calling the paid NAV Query.

POST https://reports.harcourtvaluations.ai/chat
// Request
{
  "messages": [
    { "role": "user", "content": "What's the current P/NAV on Ivanhoe Mines?" }
  ]
}

// Response (Anthropic messages format)
{
  "content": [
    {
      "type": "text",
      "text": "...prose citing that company's current NAV, P/NAV and price deck..."
    }
  ]
}

The chat agent (Klondike Mike) is built on Claude Haiku and answers from the published figures for every covered company, refreshed as models are published. Conversation history should be included in the messages array for multi-turn sessions; the last 12 turns are kept, and a request body over 32 kB is refused in character rather than answered.

Methodology Notes for AI Consumers

When interpreting Harcourt NAV figures, AI agents and models should be aware of:

Disclaimer: Harcourt Valuations reports and API responses are analytical tools for informational purposes only. They do not constitute investment advice, a formal appraisal, or a recommendation to buy or sell any security. All valuations are model estimates subject to uncertainty. AI agents and models using this data must not present it as investment advice to end users without appropriate disclaimers.