NZXplorer API Documentation
Loading developer portal...
Free API access to New Zealand capital market data. Companies, directors, governance scores, stock prices, and every NZX market announcement since 2017.
Get an API key
Sign up at /settings → API & Developer (free tier: 10 req/min)
Add your API key
Include as X-API-Key header
Start building
All endpoints return JSON
curl -H "X-API-Key: YOUR_KEY" \
"https://nzxplorer.co.nz/api/v1/companies?sector=Technology"All API requests require authentication via an API key. Pass your key in one of two ways:
Header (recommended)
X-API-Key: YOUR_KEYQuery parameter
?api_key=YOUR_KEYKeep your API key secret. Never expose it in client-side code or public repositories.
| Tier | Rate Limit | Price | Use Case |
|---|---|---|---|
| Free | 10 req/min | $0 | Personal projects, research, prototyping |
| Pro | 100 req/min | $29/mo | Apps, dashboards, data pipelines |
| Corporate | 500+ req/min | Book a Demo | Teams, commercial use, custom SLAs |
X-RateLimit-Limit, X-RateLimit-Remaining, X-API-TierAPI routes are protected against automated scraping. Requests from known scraper user agents (including AI training bots like GPTBot, CCBot, and others) are blocked with a 403 response. All legitimate access requires an API key.
X-API-Key header and using a standard user agent string.Add ?format=llm to any endpoint for token-optimized output. It drops the values we do not hold and the standard metadata envelope — but it always tells you which fields were dropped, in _absent.
Standard format
{
"data": {
"ticker": "AIR",
"name": "Air New Zealand",
"description": null,
"website_url": null,
"directors": []
},
"meta": {
"schema_version": "1.0.0",
"api_version": "v1",
"request_id": "req_...",
"timestamp": "2026-09...",
"provenance": "undeclared"
}
}LLM format (?format=llm)
{
"ticker": "AIR",
"name": "Air New Zealand",
"directors": [],
"_absent": ["description", "website_url"]
}~70% fewer tokens, and no lost information.
Absent is not zero, and not empty
A field listed in _absent means NZXplorer holds no value for it — never that the figure is zero, and never that the field does not exist. An empty array is different again: it is a measured result (“we looked and there were none”), so it is returned in full rather than dropped.
Before 2026-09-16 this format deleted absent keys silently, so those three states were indistinguishable. If you built parsing around that, note that keys now reappear in _absent and empty arrays are retained.
Add ?format=toon to any endpoint for maximum token compression. TOON (Token-Optimized Object Notation) encodes arrays of objects as pipe-delimited tabular data — 30-60% fewer tokens than JSON with lossless roundtrip fidelity.
Standard JSON
[
{"ticker":"AIR","name":"Air NZ","sector":"Industrials"},
{"ticker":"FPH","name":"Fisher & Paykel","sector":"Healthcare"},
{"ticker":"MEL","name":"Meridian","sector":"Utilities"}
]TOON format (?format=toon)
ticker|name|sector AIR|Air NZ|Industrials FPH|Fisher & Paykel|Healthcare MEL|Meridian|Utilities
~50% fewer tokens. Lossless — decode(encode(data)) == data. Nested objects use dot-notation key folding.
X-Format: toon. Content-Type: text/plain.Standard JSON responses carry a meta block with schema_version, request_id and a provenance state. Where an endpoint can cite the documents behind its rows, it also returns sources[].
| provenance | Meaning |
|---|---|
direct | Every returned row carries a resolvable source-document URL. |
reachable | Some rows resolved, or the document is one documented join away. |
label | Rows name a register or source type, but not a URL. |
none | No source column and no known path to one. |
undeclared | No claim has been made for this endpoint yet. It is not a statement that the data is unsourced — most endpoints are still to be declared. |
?format=llm and ?format=toon return bare data with no envelope, so they carry the same facts on headers instead, at no token cost: X-Schema-Version, X-Provenance and, when known, X-Data-As-Of.
Every tool on the MCP server publishes an outputSchema and annotations, and every tools/call returns structuredContent matching it, alongside the existing text content. All tools are read-only (readOnlyHint: true, destructiveHint: false, openWorldHint: false) and every input schema is closed (additionalProperties: false).
{
"schema_version": "1.0.0",
"tool": "get_company_detail",
"data": { "ticker": "AIR", "...": "..." },
"meta": {
"retrieved_at": "2026-09-16T01:51:00Z",
"availability_status": "ok",
"provenance": "undeclared",
"encoding": "json"
}
}availability_status before trusting a payload. ok is a complete result. truncated means the payload exceeded the transport cap and was cut — narrow the query or paginate, and do not read the tail as the end of the data. parse_failed is text this server could not parse as JSON. error means the tool raised, and data is null. Previously all four arrived as plain text and could not be told apart.initialize negotiates the protocol revision (2025-06-18, 2025-03-26 or 2024-11-05). Clients on the older revision can ignore structuredContent entirely — it is additive.
Add ?format=fdc3 to supported endpoints for FINOS FDC3 v2.0 standard context types. Enables interoperability with Bloomberg, Refinitiv, IRESS, and other FDC3-compliant desktop applications. All 131 issuers have ISINs, and LEIs are available for 65/131 issuers (50% coverage) via the GLEIF register.
Standard format
{
"data": {
"ticker": "AIR",
"name": "Air New Zealand",
"isin": "NZAIRE0001S2",
"sector": "Industrials"
}
}FDC3 format (?format=fdc3)
{
"type": "fdc3.instrument",
"name": "Air New Zealand",
"id": {
"ticker": "AIR",
"ISIN": "NZAIRE0001S2",
"LEI": "XN8VX00V0UCRJ3ZGN385"
},
"market": {
"MIC": "XNZE",
"name": "New Zealand Exchange",
"COUNTRY_ISOALPHA2": "NZ"
}
}Supported endpoints:
FDC3 context type mapping:
| Endpoint | FDC3 Type |
|---|---|
| /companies | fdc3.instrumentList |
| /companies/:ticker | fdc3.instrument |
| /directors | fdc3.contactList |
| /directors/:slug | fdc3.contact |
| /insider-trades | fdc3.tradeList |
| /shareholders/:ticker | fdc3.portfolio |
| /prices/:ticker | fdc3.chart |
| /metrics/:ticker | fdc3.valuation |
| /dividends/:ticker | fdc3.instrument + dividends |
| /earnings/:ticker | fdc3.instrument + earnings |
When running inside an FDC3-compliant desktop agent (IRESS MyIress, OpenFin, Glue42), NZXplorer registers intent listeners and broadcasts instrument context automatically. No configuration needed — the integration is a no-op in standard browser environments.
| Intent | Context | Action |
|---|---|---|
| ViewChart | fdc3.instrument | Navigate to company chart view |
| ViewInstrument | fdc3.instrument | Navigate to company overview page |
| ViewProfile | fdc3.contact / fdc3.instrument | Navigate to person or company profile |
| ViewResearch | fdc3.instrument | Open proxy advisory report |
| ViewQuote | fdc3.instrument | Return latest price as fdc3.valuation |
NZXplorer also broadcasts fdc3.instrument context when users navigate between company pages, enabling other connected apps to update in sync.
NZXplorer publishes an FDC3 App Directory v2 manifest for registration with desktop agent platforms.
Listens For
Broadcasts
Context Listener
An AI research assistant that uses all NZXplorer API endpoints to answer natural language questions about NZX-listed companies. Powered by Claude with tool-calling against 36 internal data tools. Features hybrid semantic search with reranking, structured copilot cards for rich visual output, and TOON token optimization for 30-60% cost reduction.
Try the Copilot in your browser — available on every page via the floating button, or as a full-page experience.
Open NZXplorer Copilot →A terminal-based research agent with 53 NZX tools, DCF valuation skills, and live RBNZ OCR data. Built on LangChain.
npx nzxplorer-agentView on GitHub →
Use the POST /api/v1/ask endpoint to integrate the Copilot into your own applications. Supports SSE streaming, multi-turn conversations, 20 personas across 4 categories: analyst modes (general, macro, governance, risk), investor frameworks (buffett, graham, lynch, etc.), NZ-specific (nz_income, nz_governance), and professional ICPs (retail_investor, financial_adviser, fund_manager, journalist, corporate_secretary, regulator), and session memory. Pass "persona": "fund_manager" to frame analysis through a specific lens. Pass "session_id": "uuid" to continue a prior conversation — the Copilot will inject your watchlist, theses, and prior topics into its context. The SSE done event returns a session_id you can use in subsequent requests. Manage sessions via GET /api/v1/ask/sessions (list) and DELETE /api/v1/ask/sessions?id=X (archive). The Copilot also builds persistent memory across sessions — it remembers your past questions and findings. Manage memories via GET /api/v1/ask/memories (list) and DELETE /api/v1/ask/memories?id=X (delete) or DELETE /api/v1/ask/memories?all=true (clear all).
# Default (general) persona
curl -X POST -H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"question": "What is the governance score for Air NZ?"}' \
"https://nzxplorer.co.nz/api/v1/ask"
# With persona (20 available: macro, governance, risk, buffett, fund_manager, journalist, etc.)
curl -X POST -H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"question": "How does the OCR cycle affect utilities?", "persona": "macro"}' \
"https://nzxplorer.co.nz/api/v1/ask"
# Resume a prior conversation (session memory)
curl -X POST -H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"question": "What changed since we last discussed?", "session_id": "SESSION_UUID"}' \
"https://nzxplorer.co.nz/api/v1/ask"
# List your sessions
curl -H "X-API-Key: YOUR_KEY" \
"https://nzxplorer.co.nz/api/v1/ask/sessions"When analysis fits a known schema, the Copilot returns structured JSON that the UI renders as visual cards. 5 card types are supported:
company_analysis
Bull/bear case, key metrics, governance flags
sector_comparison
Side-by-side multi-company metrics
risk_assessment
Risk level, factors, mitigation, confidence
dividend_outlook
Yield, safety, cut probability, payout ratio
director_profile
Boards, overboarding risk, voting support
The Copilot's search_semantic tool combines BM25 keyword search with pgvector semantic similarity via Reciprocal Rank Fusion (RRF, k=60), optionally reranked by Cohere rerank-v3.5. This finds both exact keyword matches and conceptual matches across NZX announcements. The same hybrid search powers the /api/v1/semantic-search?mode=hybrid&rerank=true endpoint.
Connect NZXplorer data directly to Claude Desktop, Cursor, or any MCP-compatible client. The remote MCP server exposes 189 tools wrapping the NZX API — including anomaly detection, market signals, accounting quality, IR quality, peer mentions, board briefings, and skills matrices. 5 of them (proxy reports, research briefings, director due diligence, semantic search, and the stock screener) require a Pro plan.
Paste this remote MCP URL into Claude Desktop, Cursor, Goose, or Continue. 29 read-only tools, 30 calls/hour and 100 calls/day per IP, free, zero signup:
{
"mcpServers": {
"nzxplorer": {
"url": "https://mcp.nzxplorer.co.nz"
}
}
}Need more? Get a free API key from Settings → API & Developer and send it as X-API-Key to https://nzxplorer.co.nz/api/v1/mcp: a free key gets 184 tools (250 calls/day), and Pro plans unlock all 189 tools including proxy reports, research briefings, and semantic search. The npx installs below use the nzxplorer-mcp stdio package, an older, separate build with its own toolset; the remote server has the current one.
Claude Code CLI:
claude mcp add nzxplorer -- npx -y nzxplorer-mcp
Smithery CLI works for Claude Desktop, Cursor, Windsurf, and Goose — auto-edits your client config:
npx -y @smithery/cli@latest install @mambaventures/nzxplorer-mcp --client claude
Replace claude with cursor, windsurf, or goose as needed. After install, set NZXPLORER_API_KEY from your Settings → API & Developer page.
npx nzxplorer-mcp
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"nzxplorer": {
"command": "npx",
"args": ["-y", "nzxplorer-mcp"],
"env": {
"NZXPLORER_API_KEY": "your_api_key_here"
}
}
}
}Add to .cursor/mcp.json in your project (or global Cursor MCP settings):
{
"mcpServers": {
"nzxplorer": {
"command": "npx",
"args": ["-y", "nzxplorer-mcp"],
"env": {
"NZXPLORER_API_KEY": "your_api_key_here"
}
}
}
}Get your API key above. Full setup docs (including local-build option) in the GitHub repo.
The NZXplorer Copilot uses a Multi-MCP architecture — it can connect to external MCP servers alongside its native 189 tools. This allows the AI to cross-reference NZXplorer data with live external sources in a single conversation.
NZ Companies Office
Live NZBN lookups, official director lists, registration status — cross-referenced with NZXplorer's extracted data.
Web Search
Real-time news, FMA notices, and breaking company events not yet in the NZXplorer database.
Web Fetch
Read any URL — annual reports, regulatory notices, competitor filings — and combine with NZXplorer analysis.
Check connection status: GET /api/v1/mcp/status
| Dataset | Records | Updated |
|---|---|---|
| NZX-listed companies | 131 | Real-time |
| Company directors | 2,410 | Weekly |
| Governance scores (GRS v2) | Per scored issuer | Monthly |
| Stock prices (daily OHLCV) | 586,777 | Daily |
| Market announcements | 69,251 | Daily |
| Director share transactions | 10,050 | Weekly |
| Executive compensation | 1,525 | Annually |
| Earnings results | 1,703 | Annually |
| Dividends | 2,367 | Weekly |
| AGM resolutions | 1,848 | Annually |
| Capital raises | 12,292 | Annually |
| Code | Error Type | Description | Retry? |
|---|---|---|---|
200 | Success | Request succeeded. Data in response body. | N/A |
400 | VALIDATION_ERROR | Invalid parameters, missing required fields, or malformed input. | No — fix request |
401 | UNAUTHORIZED | Missing, invalid, or expired API key. | No — check key |
403 | FORBIDDEN | Valid key but insufficient tier for this endpoint or data scope. | No — upgrade tier |
404 | NOT_FOUND | Ticker, slug, or resource does not exist. | No |
429 | RATE_LIMITED | Rate limit exceeded. Check Retry-After header. | Yes — after Retry-After seconds |
500 | INTERNAL_ERROR | Server error. Logged and alerted automatically. | Yes — with exponential backoff |
502 | EXTERNAL_SERVICE_ERROR | Upstream dependency (Supabase, Anthropic) temporarily unavailable. | Yes — after 5s |
All error responses follow a consistent JSON envelope with machine-readable error codes, timestamps, and optional validation details. Use the code field for programmatic error handling.
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid ticker format. Expected 2-5 uppercase letters.",
"timestamp": "2026-03-26T02:15:00.000Z",
"details": [
{
"field": "ticker",
"message": "Must be 2-5 uppercase letters",
"received": "air new zealand"
}
]
}
}Uptime guarantees with SLA credits for Corporate plans. Real-time status at /status. Health check: GET /api/v1/health.
| Tier | Uptime SLA | Max Downtime/Month | SLA Credits |
|---|---|---|---|
| Free | 99.0% | 7h 18m | None |
| Pro | 99.5% | 3h 39m | None |
| Corporate | 99.9%+ | 43m 50s | Negotiated per agreement |
| Request Type | Target (p95) | Examples |
|---|---|---|
| Simple lookup | < 200ms | /companies/{ticker}, /governance-scores/{ticker} |
| List/search query | < 500ms | /companies, /directors, /insider-trades |
| Complex analytics | < 2s | /screener, /semantic-search, /fair-value/{ticker} |
| PDF generation | < 5s | /proxy/{ticker} (PDF export) |
| XLSX export | < 10s | /export/xlsx |
| AI-powered (Copilot) | < 30s | /ask, /deep-research/{ticker} |
| Severity | Definition | Response | Resolution |
|---|---|---|---|
| P1 — Critical | API fully unavailable or data loss | 15 min | 4 hours |
| P2 — Major | Degraded performance (>2x latency) or partial outage | 1 hour | 8 hours |
| P3 — Minor | Single endpoint error or stale data | 4 hours | 48 hours |
| P4 — Low | Documentation issue or cosmetic bug | 1 business day | Next release |
Every API response includes correlation and performance headers for debugging and monitoring.
| Header | Description |
|---|---|
| X-Request-Id | UUID correlation ID (propagated or generated per request) |
| X-Response-Time | Server-side processing time in milliseconds |
| X-RateLimit-Limit | Max requests per minute for your tier |
| X-RateLimit-Remaining | Requests remaining in current window |
| X-RateLimit-Reset | Unix timestamp when window resets |
| X-API-Tier | Your API tier (free/pro/enterprise/institutional) |
| X-Format | Response format (json/llm/toon/fdc3) |
Window: Sundays 00:00-06:00 NZST. 48-hour advance notice via email to all API key holders. Automated maintenance (database optimizations, index rebuilds) runs without downtime. Unscheduled emergency maintenance may occur with best-effort notification.
Documented update cadence for every data table. Freshness is monitored by automated audit scripts and stored in data_freshness_alerts. View current freshness at /status.
| Data / Endpoint | Freshness SLA | Update Schedule | Source |
|---|---|---|---|
| Stock prices (OHLCV) | < 1 trading day | Daily 6:00 UTC (+ hourly intraday) | Yahoo Finance |
| Performance metrics | < 1 trading day | Daily 6:00 UTC (step 3) | Derived from prices |
| Technical signals (RSI, SMA) | < 1 trading day | Daily 6:00 UTC (step 4) | Derived from prices |
| Market announcements | < 4 hours | Hourly 21:00-04:00 UTC (trading hours) | NZX API |
| Announcement sentiment | < 1 day | Daily 5:00 UTC | Claude Haiku AI |
| Insider trades | < 7 days | Weekly Saturday 6:00 UTC | NZX SHINTR PDFs |
| GRS governance scores | < 7 days | Weekly Monday 7:00 UTC | Computed from 6 components |
| Accounting quality scores | < 30 days | Monthly 1st 8:00 UTC | M-score, F-score, Z-score |
| Director appointments | < 7 days | Weekly Wednesday 8:00 UTC | MBIE Companies Office |
| AGM calendar & results | < 7 days | Weekly Wednesday 6:00 UTC | NZX announcements |
| Annual reports (financials) | < 7 days of filing | Weekly Sunday 8:00 UTC | NZX PDFs + Claude Haiku |
| Earnings results | < 2 days of FLLYR/HALFYR | Triggered by announcement | NZX announcements |
| Financial statements | < 14 days of annual report | Extracted on report discovery | Annual report PDFs |
| Dividends | < 1 day | Daily with announcements | NZX DVDEND announcements |
| Fund holdings (ETF) | < 30 days | Monthly 5th 20:00 UTC | ETF factsheets + Disclose |
| Broker/analyst consensus | < 7 days | Weekly Saturday 7:00 UTC | Yahoo Finance |
| Director skills & bios | < 30 days | Monthly 1st 10:00 UTC | Annual report PDFs |
| Executive compensation | < 30 days | Monthly 8th 7:00 UTC | Annual report PDFs |
| Corporate buzzwords | < 30 days | Monthly 15th 6:00 UTC | Regex scan of announcements |
| Political connections | < 90 days | Quarterly | Parliament.nz, Electoral Commission |
| Insolvency screening | < 7 days | Weekly Friday 7:00 UTC | MBIE Insolvency Register |
| Court litigation | < 30 days | Monthly 1st 7:00 UTC | Ministry of Justice API |
| Cross-platform links | < 30 days | Monthly 1st 7:00 UTC | Bio NER extraction |
| Signal fusions | < 1 day | Daily 17:30 UTC | 10-rule composite detection |
audit-data-freshness.cjs runs daily at 18:00 UTC checking 8 core data types against thresholds. Weekly audits run data quality (10 integrity checks), completeness (12 categories per company), and random sampling (~65 records). Results stored in data_freshness_alerts, data_quality_issues, data_completeness_scores tables. Institutional clients receive email alerts for any SLA breach.NZXplorer API v1 — New Zealand Capital Market Intelligence
Questions? Email api@nzxplorer.co.nz