Reference

JSON shape

--json prints a ScanResult. The declaration below is the authoritative one, read from the package that defines it rather than retyped here.

The declaration

export interface ScanResult { readonly network: 'testnet'; readonly contracts: readonly ContractRef[]; /** Each canonical ledger key occurs once; contracts are back-references on entries. */ readonly entries: Readonly<Record<LedgerKey, LedgerEntryTTL>>; /** Absence is not proof of archival/deletion. Consumers must handle partial scans. */ readonly issues: readonly ScanIssue[]; /** Omitted by legacy producers: coverage unknown, never proof of a complete scan. */ readonly coverage?: { /** RPC reads specified keys; it does not enumerate arbitrary contract storage. */ readonly mode: 'known-keys'; /** Unique, validated explicit data keys, not a count of all on-chain storage. */ readonly dataKeysSuppliedByContract: Readonly<Record<ContractId, number>>; /** Caller assertion of no additional data keys, not verified storage enumeration. */ readonly noDataKeysDeclaredByContract?: Readonly<Record<ContractId, boolean>>; }; /** Omitted by a TTL-only scan; missing estimate does not mean zero rent. */ readonly rentEstimate?: RentEstimate; }

Read from packages/shared-types/src/index.ts at build time. Every JSON panel on this site prints the same shape the CLI prints.

Entries are keyed by ledger key

Not by contract. A ledger key identifies the entry itself, and the same key can serve several contracts — that is exactly what a shared code entry is. Each entry carries the contracts it serves, so the relationship is readable in the direction the chain can actually answer.

Read the issues, not just the grade

The human report compresses issues into a count. The JSON carries each one with its code and the contracts it applies to, and a consumer that reads only the health grade will treat a partial scan as a complete one. Undetermined, unread, not found

What you can rely on

The shape is versioned with the package. Ledgers are integers and are the authoritative values; any date in the output is derived at five seconds per ledger and is an estimate. If you are building on this, compare ledgers and render dates.

Next Undetermined, unread, not found Three ways a scan declines to conclude. Absence is not health.