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.
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 (Street→ST) and quadrant words are normalized;%,_and\are literal. Matching rows return the canonical address incanonical_identity.address.- Sorting by
addressrequires anaddressfilter; an unfiltered address sort returns HTTP 400invalid_request.
entity_ref as the tie-breaker, so pages never duplicate or skip records.
Response data
"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.
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.