Skip to main content
National property records for Washington, D.C., Maryland and six Northern Virginia jurisdictions (Arlington, Fairfax County, Loudoun, Alexandria, City of Fairfax, Falls Church). Every record carries a citation: publisher, dataset and the date Quoin published it. Base URL: https://portal.quoindata.com/api/v4. Authenticate with Authorization: Bearer <API key> from https://portal.quoindata.com/keys. All operations are GET. Machine-readable schema: /api/v4/openapi.json.

Prices

Prices are per successful call. Each page of records or search is a separate call. Errors, empty searches, timeouts, “not found” responses and retries with the same Idempotency-Key are never charged. Welcome credit and billing are shared with v3.

Identifiers

Every entity has a permanent q_id: a type prefix plus a UUID. prop_ (property group) and loan_ are reserved and have no data yet. The entity model differs by state: D.C. has addresses, parcels, accounts and units; Maryland has addresses and accounts; Virginia has addresses and parcels. jurisdiction is one of these Census codes. A county filter on find can take a few seconds; a state filter is fast.

Typical flow

Operations

find: q is an address street line (text after the first comma is ignored; exact match after normalizing case and spaces) or an official label (D.C. SSL, Maryland account, Virginia PIN/PARID/RPC). Optional types is a comma list (addr,parc,acct,unit); limit 1–100, default 20. Returns items[] of {q_id, type, label, jurisdiction, matched_on}. No match returns an empty list. catalog: published sources with {state, source_id, source, dataset, kind, records, as_of}. as_of is when the catalog was built, not when the source was pulled (see the table above), and records counts every version. Adding jurisdiction (state level) or source_id also returns fields: each field’s type, fill rate and an example value from a 2,000-row sample. Use these field names in search filters. connected: linked entities up to depth 1–3 (default 2): {q_id, type, relation, via, depth}. Relations: at (at an address), billed_to (account bills parcel), in (in a jurisdiction). records: current source records about the entity and its neighbourhood (depth 2): {record_ref, kind, source_id, jurisdiction, about, published_at, citation, data}. data is the full source row, field names as the publisher wrote them. Optional kind (for example permit, sale, tax, assessment). limit 1–100, default 50. When more exist, data.next_cursor is set; pass it back as cursor. summary: one best value per canonical field: year_built, bedrooms, full_baths, half_baths, living_area_sqft, assessed_total, last_sale_price, last_sale_date. Each item has {field, label, value, citation, record_ref, alternatives}. Optional fields is a comma list. history: every version of one record, newest first: {version, published_at, removed, citation, data}. removed: true means the publisher stopped carrying it. search: records of one kind in one jurisdiction, filtered on the source’s own field names (from catalog): {cursor, record_ref, kind, source_id, jurisdiction, published_at, citation, data, q_ids}. filter is URL-encoded JSON with up to 5 fields; a bare value means eq. Operators: eq, ne, in (list), gt, gte, lt, lte (numbers compare numerically, everything else as text), prefix and contains (3+ characters, no % _ \), exists (true/false). "$source_id" limits the search to one source. limit 1–100, default 50; page with cursor.
Searches that match many records return quickly. A filter on a rare value over a large source can run past the time limit; that returns a free 503 query_timeout. Narrow it with "$source_id" or a more common value. Owner names are matched as text, not resolved to people, and a sale’s name fields can hold the seller as well as the buyer.

Response envelope

Headers: X-Quoin-Price-Micro-USD, X-Quoin-Charged-Micro-USD (0 on replay), X-Quoin-Balance-Micro-USD, X-Quoin-Replayed, X-RateLimit-*.

Errors

Limits

Shared with v3, per account: 60 calls per minute, four concurrent, 10,000 free and 1,000 paid calls per rolling 24 hours, and caps on distinct entities delivered per day.

Known data limitations

  • Some Virginia dates are epoch milliseconds; D.C. sales use 1900-01-01 as a placeholder. summary picks the latest sale by comparing dates as text, so last_sale_price and last_sale_date can come from an older sale. Check alternatives, or read the sale records, when the sale matters.
  • Maryland has no bedroom or bathroom counts.
  • catalog filters by state even when given a county code.
  • Arlington tax payments appear twice (bulk file and API sources, the same rows) until the next Virginia load.
  • Each source has been published once so far, so history returns one version per record.