Skip to main content
Typical flow: catalog to learn what is covered, resolve or search to obtain references, get_property or get_entity to read records, traverse to move between related entities, get_evidence to verify.

get_catalog

GET /api/v2/catalog · $0.05 per call Describes what the API covers before you query it. Using a filter on a facet that does not support it returns HTTP 422 unsupported_filter.
Coverage status values: available, partial, gated, unavailable, stale, source_unavailable, retired, not_applicable. A missing record in an available domain means no matching record exists in the current publication, not that no public record exists anywhere.

resolve_entities

POST /api/v2/resolutions · $0.05 per call, regardless of item count Turns official identifiers or street addresses into entity references. Batch up to 50 claims per call. Request body Identifier namespaces in the current publication: Response data.items[] precision and method describe address-based matching only. For identifier matches (match_basis: "identifier") both are null; the match is by official identifier. For address matches, precision is exact when the address maps to exactly one record, contextual when the match came through a parent (for example a unit resolved through its building’s address), and ambiguous when several records fit. A contextual match is context, not proof of identity. Address handling: punctuation and whitespace are normalized; a missing D.C. quadrant (NW, NE, SW, SE) is tried in all four positions and reported as method: "dc_quadrant_fallback" with precision: "contextual"; a unit value is carried through and matched separately.

get_entity

GET /api/v2/entities/{entity_ref} · $0.05 Reads one canonical entity of any kind. Unknown references return HTTP 404 not_found. Response data.entity

traverse_relationships

GET /api/v2/entities/{entity_ref}/relationships · $0.05 per page Walks sourced relationships from a starting entity. Relationship kinds in the current publication and their direction: Because edges point toward parcels, use direction=out from an address, unit or tax account and direction=in (or both) from a parcel. About 12% of active tax accounts have no accepted parcel link in the current publication; traversing from them returns the root node and no edges. Response data

search_properties

POST /api/v2/property-searches · $0.05 per page Bounded, deterministic search over entities of one kind in one area. Request body Filter semantics:
  • entity_ref / property_ref: exact match. Two different reference filters in one request match nothing.
  • address: case-insensitive prefix on the normalized address. Punctuation, extra whitespace, street suffixes (StreetST) and quadrant words are normalized; %, _ and \ are literal. Matching rows return the canonical address in canonical_identity.address.
  • Sorting by address requires an address filter; an unfiltered address sort returns HTTP 400 invalid_request.
Ordering is stable with entity_ref as the tie-breaker, so pages never duplicate or skip records. Response data
Unfiltered listing ("filters": [], sort by entity_ref) is supported and is how you enumerate an area; use the cursor to continue.

get_property

POST /api/v2/property-queries · $0.05 per call Reads the record sections of up to five tax accounts. Request body Response data.items[] Source-backed values are { value, status, source_refs[] } triples; status is reported when the value is taken directly from the source, and source_refs feed get_evidence. Record metadata such as stage, tax_year and record_date, and the whole identity section, are plain values. There is no continuation inside a section. When has_more is true, next_cursor is null and meta.truncated is true; the only way to see more records is a larger section_limit, up to 100. Treat a section as bounded, not complete. The response is also capped at 256 KiB; five accounts with all sections and section_limit 100 will exceed it and arrays are shortened. Ask for the sections you need.
Assessment stages are prior (TY2025), current (TY2026) and proposed (TY2027), exactly as the Office of Tax and Revenue publishes them. The API does not interpolate or treat a proposed value as final.

get_evidence

POST /api/v2/evidence-lookups · $0.05 per call Expands source references into the official record they came from and a human verification route. Request body Response data A reference that cannot be resolved does not fail the call: the item carries outcome: "invalid_reference" or "not_found" and the envelope status is partial.
The live portal may be newer than the dated extract the fact came from. Compare the cited record date, not only the value.