> ## 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.

# Search records

> Filter one record kind across a jurisdiction on the source's own fields.

[`search`](/api-reference/search/search-records) finds records of one `kind` in one `jurisdiction` that match a filter, for example every sale over \$1M in Fairfax County.

```bash theme={null}
curl -G "https://portal.quoindata.com/api/v4/search" \
  -H "Authorization: Bearer $QUOIN_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  --data-urlencode "jurisdiction=51059" \
  --data-urlencode "kind=sale" \
  --data-urlencode 'filter={"$source_id":"fairfax_county_dta_re_sales","PRICE":{"gte":1000000}}' \
  --data-urlencode "limit=50"
```

## Building a filter

<Steps>
  <Step title="Pick the kind and source">
    Call [`catalog`](/api-reference/lookups/list-sources) with the jurisdiction to see each source's `kind` and `source_id`.
  </Step>

  <Step title="Pick the fields">
    `catalog` with `source_id` lists that source's field names, types and example values. Field names are case-sensitive and exactly as the publisher wrote them.
  </Step>

  <Step title="Write the filter">
    `filter` is a JSON object of up to 5 fields, URL-encoded. A bare value means equals. Add `"$source_id"` to search one source.
  </Step>
</Steps>

## Operators

| Operator | Example | Matches |
| - | - | - |
| `eq` (or a bare value) | `{"CaseStatus": "Issued"}` | Exactly this value |
| `ne` | `{"CaseStatus": {"ne": "Void"}}` | Anything else |
| `in` | `{"status": {"in": ["ISSUED", "FINAL"]}}` | Any value in the list (up to 50) |
| `gt`, `gte`, `lt`, `lte` | `{"PRICE": {"gte": 500000, "lt": 1000000}}` | Ranges. Numbers compare numerically, everything else as text |
| `prefix` | `{"ownername": {"prefix": "SMITH"}}` | Text starting with this (3+ characters) |
| `contains` | `{"OWN1": {"contains": "TRUST"}}` | Text containing this (3+ characters) |
| `exists` | `{"FINALIZEDATE": {"exists": true}}` | The field is present (`true`) or absent (`false`) |

`prefix` and `contains` values cannot include `%`, `_` or `\`. Dates compare as text, so ISO dates (`"2025-01-01"`) work with `gte` and `lt` when the source uses ISO dates.

## Paging

Results come 1–100 at a time (default 50). When more exist, the response includes `next_cursor`; pass it back as `cursor` with the same parameters. See [Pagination](/api-basics/pagination).

## Performance

Search reads matching records as it scans a source, so:

* **Broad filters are fast.** Common values return in well under a second.
* **Rare values over large sources can time out.** The call stops after about 18 seconds and returns a free `503 query_timeout`.
* **Narrow it:** add `"$source_id"`, search a county instead of a state, or filter on a more common value first.

## Billing

Each page that returns results is billable. A search with no matches returns `404 not_found` and is free, as are timeouts and invalid filters.


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