Financial research pipelines often break in the gap between retrieving a matching paragraph and verifying what a filing says. A search snippet finds a capital expenditure figure without the lease commitments two notes down. A Hong Kong announcement states a dividend in RMB while regulatory releases list restricted third-party accounts in HKD. Quantitative tools hit similar input bugs when callers pass 5 instead of 0.05 for a 5% rate, or replace missing history with zero.

Eqvero separates fast lookup tools from full-section retrieval, asynchronous deep research, and pre-quoted financial calculations so an application or AI assistant can trace claims back to original US and Hong Kong disclosures. This guide covers the read-first verification path across those tools, grounded in two published cases and the conventions in eqvero-skill.

Why search snippets distort US and Hong Kong disclosures

A text-search fragment drops the table headers, footnotes, and entity scope that govern a reported figure. Two published investigations on Eqvero show how much context sits outside a matching snippet.

In Microsoft's FY2027 Q1 case (October 28, 2026 10-Q), operating cash flow reached $58.000 billion against $39.367 billion in cash additions to property and equipment, leaving $18.633 billion. A snippet search for capital expenditure stops at those two lines. Expanding the surrounding notes reveals $12.949 billion of net outflows in other investing activities tied mainly to component-procurement arrangements, $35.7 billion in related component-procurement receivables, $12.6 billion in restricted supplier investments in Note 1, and $364.6 billion in leases not yet commenced in Note 12.

Hong Kong disclosures add currency and entity boundaries on top of footnote length. In Chabaidao's IPO allocation and dividend case, net global-offering proceeds were HK$2.4633 billion (HK$706.8 million unused at June 30), group cash and cash equivalents stood at RMB2.9643 billion, and the October 30 interim dividend (RMB0.15 per share, roughly RMB221.6 million across 1,477,634,250 shares) came from internal funds while trading remained suspended. Separately, Hong Kong SFC release 26PR168 imposed asset disposal restrictions up to HK$4,379,463,215 on third-party accounts; company deposits were not frozen. Reading an isolated excerpt mixes HKD proceeds with RMB balances and misattributes third-party restrictions to corporate bank cash.

Because snippets strip away column headers and reporting scope, Eqvero splits retrieval into two explicit steps: search first to locate candidate references, then fetch the full section or table before reasoning over the numbers.

Resolving issuerId and expanding evidence sections

Every company-scoped operation expects the UUID returned by companies_search (companies.search over HTTP RPC), never a raw stock ticker. Once you have issuerId, combine structured endpoints (financials_metrics, financials_query, events_list, ownership_list, and prices_list) with two-stage disclosure reading: call evidence_search to get matching IDs, then call evidence_section and evidence_table to pull full prose and aligned table rows.

The Python helper below implements that read-only lookup path against POST /api/v1/operations/<OPERATION>, reading EQVERO_API_KEY from the environment and keeping issuerId explicit across calls:

import json import os import urllib.request BASE_URL = "https://eqvero.com/api/v1/operations" API_KEY = os.environ["EQVERO_API_KEY"] def call_op(operation: str, payload: dict) -> dict: req = urllib.request.Request( f"{BASE_URL}/{operation}", data=json.dumps(payload).encode("utf-8"), headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json", }, method="POST", ) with urllib.request.urlopen(req, timeout=20) as resp: return json.loads(resp.read().decode("utf-8")) def resolve_issuer_id(query: str) -> str: res = call_op("companies.search", {"query": query, "limit": 1}) items = res.get("data", {}).get("items", []) if not items: raise LookupError(f"No issuer matched query: {query}") return items[0]["id"] def fetch_evidence_bundle(issuer_id: str, query: str) -> dict: hits = call_op("evidence.search", {"issuerId": issuer_id, "query": query}) items = hits.get("data", {}).get("items", []) sections = [] tables = [] for item in items[:3]: target_id = item.get("id") if not target_id: continue item_type = (item.get("type") or "").lower() if item_type == "table": tables.append(call_op("evidence.table", {"id": target_id})) else: sections.append(call_op("evidence.section", {"id": target_id})) return {"search_hits": items, "sections": sections, "tables": tables} 

Checking events_list and ownership_list alongside financials_query prevents date-mismatch bugs when announcements happen after a balance sheet cutoff. In Hong Kong filings, an interim report captures cash balances as of June 30, while an October shareholder meeting notice records a later dividend authorization and suspension status. Keeping period, currency, and filing date attached to each record stops client pipelines from blending two snapshots into one figure.

Scoped deep research and pre-quoted financial calculations

When a question spans multiple filings, counterparties, and reporting periods, research_create (research.create) starts an asynchronous investigation with issuerId, a concrete question, mode: "deep", and a stable idempotencyKey. Effective prompts define the exact financial relationship and period constraints instead of asking for a broad summary or price target:

For Microsoft, break down the last three years of operating cash flow, cash capital expenditure, finance leases, and unpaid construction commitments to assess whether earnings growth has increased distributable cash. Keep periods consistent and link the disclosures behind the figures.

Read status and final reports through research_get, and submit follow-up questions within the same task context using research_followup. If a network timeout drops the initial acceptance response, check research_submission with the original idempotencyKey before sending a new request.

Quantitative tools follow a strict pre-flight sequence to block silent unit mistakes and unquoted runs:

  1. Inspect available portfolio, factor, valuation, bond, and option models and their field schemas with analytics_methods (analytics.methods).
  2. Validate inputs and preview usage cost with analytics_quote (analytics.quote).
  3. Submit analytics_create (analytics.create) only after confirming the quote, then read computed values from analytics_get.

Pass rates and proportions as decimals (0.05 for 5%, never 5), and parse returned monetary strings with Python's Decimal class. When a required input is missing from the underlying filings, Eqvero reports the gap explicitly and does not substitute zero. Surface that missing-field notice directly to the caller so unverified assumptions never pass as computed outputs.

Research rules with eqvero-skill and scope boundaries

MCP and HTTP RPC expose the tools; the optional eqvero-skill repository adds written research conventions for assistants like Claude Code and Cursor. Its SKILL.md rules check actual tool permissions up front, distinguish executed transactions from proposed arrangements or regulatory inquiries, and preserve any missing items or conditions that could alter a conclusion.

Two operational limits apply to every workflow. Eqvero's five-year disclosure library is still being built and expanded, so confirm that your target US or Hong Kong issuer and reporting periods exist in the library before scheduling batch pipelines. API and MCP access also requires a Basic or higher plan with a dedicated key created under Keys and usage, and AI-assisted research organizes original disclosures for review; it does not replace primary filings, audit conclusions, or personalized investment judgment.

For client installation snippets, key isolation, and task-recovery code, see Connecting Eqvero MCP and HTTP API without duplicate tasks or ticker bugs, the Eqvero product overview, and the Eqvero developer documentation.

Part of the Eqvero: Product Guides & Updates series.