> ## Documentation Index
> Fetch the complete documentation index at: https://docs.quoindata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Look up a property

> From a street address to cited property data in three calls.

This is the most common workflow: resolve an address, find its parcel or tax account, then read the data.

<Steps>
  <Step title="Resolve the address">
    `find` matches an address street line (exact after normalizing case and spaces) or an official number: D.C. SSL, Maryland account, Virginia PIN, PARID or RPC. If several entities match, ask the user to choose.
  </Step>

  <Step title="Walk to the parcel or account">
    Most data is attached to parcels (D.C., Virginia) or tax accounts (Maryland). `connected` returns them from the address. See [Entities by state](/concepts/entities#entities-by-state).
  </Step>

  <Step title="Read the data">
    Call `summary` for headline facts, then `records` when you need the underlying rows, such as every sale or permit.
  </Step>
</Steps>

<CodeGroup>
  ```bash curl theme={null}
  BASE="https://portal.quoindata.com/api/v4"
  AUTH="Authorization: Bearer $QUOIN_KEY"

  # 1. Free: address to q_id
  ADDR=$(curl -sG "$BASE/find" -H "$AUTH" --data-urlencode "q=1350 Pennsylvania Ave NW" \
    --data-urlencode "jurisdiction=11" | jq -r '.data.items[0].q_id')

  # 2. Free: the parcel at that address
  PARC=$(curl -s "$BASE/entities/$ADDR/connected?depth=1" -H "$AUTH" \
    | jq -r '.data.items[] | select(.type=="parc") | .q_id' | head -1)

  # 3. Billable: summary, then the sale records
  curl -s "$BASE/entities/$PARC/summary" -H "$AUTH" -H "Idempotency-Key: $(uuidgen)"
  curl -s "$BASE/entities/$PARC/records?kind=sale&limit=50" -H "$AUTH" -H "Idempotency-Key: $(uuidgen)"
  ```

  ```javascript JavaScript theme={null}
  const BASE = "https://portal.quoindata.com/api/v4";
  const headers = { Authorization: `Bearer ${process.env.QUOIN_KEY}` };

  async function call(path, params = {}, billable = false) {
    const url = new URL(BASE + path);
    Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
    const res = await fetch(url, {
      headers: billable ? { ...headers, "Idempotency-Key": crypto.randomUUID() } : headers,
    });
    const body = await res.json();
    if (body.status === "error") throw new Error(`${body.error.code}: ${body.error.message}`);
    return body.data;
  }

  const { items: [address] } = await call("/find", { q: "1350 Pennsylvania Ave NW", jurisdiction: "11" });
  const linked = await call(`/entities/${address.q_id}/connected`, { depth: 1 });
  const parcel = linked.items.find((e) => e.type === "parc");
  const summary = await call(`/entities/${parcel.q_id}/summary`, {}, true);
  console.log(summary.items);
  ```

  ```python Python theme={null}
  import os, uuid, requests

  BASE = "https://portal.quoindata.com/api/v4"
  HEADERS = {"Authorization": f"Bearer {os.environ['QUOIN_KEY']}"}

  def call(path, params=None, billable=False):
      headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())} if billable else HEADERS
      body = requests.get(BASE + path, params=params, headers=headers, timeout=30).json()
      if body["status"] == "error":
          raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
      return body["data"]

  address = call("/find", {"q": "1350 Pennsylvania Ave NW", "jurisdiction": "11"})["items"][0]
  linked = call(f"/entities/{address['q_id']}/connected", {"depth": 1})
  parcel = next(e for e in linked["items"] if e["type"] == "parc")
  summary = call(f"/entities/{parcel['q_id']}/summary", billable=True)
  print(summary["items"])
  ```
</CodeGroup>

## Tips

* **Do the free steps first.** Confirm you have the right entity before making billable calls.
* **Use `summary` before `records`.** One call covers the headline facts across every source.
* **Filter `records` by `kind`.** `kind=sale` or `kind=permit` keeps pages small and relevant.
* **Reuse responses.** Store what you read; reading the same data again is billed again. Retrying with the same [Idempotency-Key](/api-basics/idempotency) is not.
* **Check `alternatives`.** When sources disagree, `summary` shows the other values with their citations.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.