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

# Reading Data

> The collections available through the BrikSync PropOS API, how cursor pagination and filtering work, and example requests.

The API exposes seven read-only collections. Each one requires an API key with the matching `:read` scope — see [Authentication](/api/authentication) for the full scope list.

<Note>
  Every request only ever returns records that belong to your own organisation. Requesting a record
  that exists but belongs to someone else's organisation returns the same `not_found` you'd get for
  a record that doesn't exist at all.
</Note>

***

## Collections

| Collection             | Endpoint                       | Scope needed       | Filters                                           |
| ---------------------- | ------------------------------ | ------------------ | ------------------------------------------------- |
| Properties             | `/api/v1/properties`           | `properties:read`  | `city`, `state`, `type`, `is_active`              |
| Units                  | `/api/v1/units`                | `units:read`       | `property_id`, `status`                           |
| Tenant contact records | `/api/v1/tenants`              | `tenants:read`     | `is_active`                                       |
| Leases                 | `/api/v1/leases`               | `leases:read`      | `status`, `unit_id`, `tenant_id`, `end_date`      |
| Payments               | `/api/v1/payments`             | `payments:read`    | `status`, `tenant_id`, `lease_id`, `due_date`     |
| Maintenance requests   | `/api/v1/maintenance_requests` | `maintenance:read` | `status`, `priority`, `property_id`, `unit_id`    |
| Documents              | `/api/v1/documents`            | `documents:read`   | `type`, `entity_type`, `entity_id`, `is_verified` |

<Note>
  The tenant collection returns contact details only — name, email, phone, and status. It does not
  expose financial, income, credit, or identity information, and there is no scoring or screening
  endpoint anywhere in the API.
</Note>

<Note>
  The document collection returns metadata only (name, type, size, and which record it belongs to).
  File contents are not available through the API.
</Note>

***

## Two ways to read a collection

**List a collection**, one page at a time:

```
GET /api/v1/{collection}
```

**Get a single record** by its ID:

```
GET /api/v1/{collection}/{id}
```

A single-record response looks like:

```json theme={null}
{
  "data": { "id": "...", "...": "..." }
}
```

A list response looks like:

```json theme={null}
{
  "data": [{ "id": "...", "...": "..." }],
  "nextCursor": "eyJjIjoiMjAyNi0wOC0xOVQxMjowMDowMFoiLCJpIjoiLi4uIn0",
  "hasMore": true
}
```

***

## Pagination

Lists use **cursor-based pagination**, not page numbers. Every response includes:

* `nextCursor` — an opaque token. Pass it as the `cursor` query parameter to fetch the next page. `null` on the last page.
* `hasMore` — `true` if there's a next page, `false` on the last one.

Request parameters:

| Parameter | Description                                                                             |
| --------- | --------------------------------------------------------------------------------------- |
| `cursor`  | Continue from a previous response's `nextCursor`. Omit it to start from the first page. |
| `limit`   | Records per page. Defaults to 25, maximum **100**.                                      |

```bash theme={null}
# First page
curl "https://briksync.com/api/v1/properties?limit=50" \
  -H "Authorization: Bearer $BRIKSYNC_API_KEY"

# Next page, using the nextCursor from the previous response
curl "https://briksync.com/api/v1/properties?limit=50&cursor=eyJjIjoiMjAyNi0wOC0xOVQxMjowMDowMFoiLCJpIjoiLi4uIn0" \
  -H "Authorization: Bearer $BRIKSYNC_API_KEY"
```

<Tip>
  Keep walking pages until `hasMore` is `false`. Cursors stay correct even while new records are
  being added, so it's safe to page through a large portfolio over time without missing or repeating
  records.
</Tip>

<Warning>
  A cursor is opaque — don't try to construct or edit one by hand. If a cursor is invalid or
  malformed, the API returns `invalid_request` rather than silently restarting from the beginning,
  so you never lose track of where you were.
</Warning>

***

## Filtering

Each collection accepts a specific set of filters as query parameters (see the table above). Anything not listed for that collection is rejected rather than silently ignored.

```bash theme={null}
# Active properties in Austin
curl "https://briksync.com/api/v1/properties?city=Austin&is_active=true" \
  -H "Authorization: Bearer $BRIKSYNC_API_KEY"

# Leases ending on or before a given date
curl "https://briksync.com/api/v1/leases?end_date=2026-12-31" \
  -H "Authorization: Bearer $BRIKSYNC_API_KEY"

# Open, high-priority maintenance requests for one property
curl "https://briksync.com/api/v1/maintenance_requests?property_id=<property-id>&status=open&priority=high" \
  -H "Authorization: Bearer $BRIKSYNC_API_KEY"
```

Filters and pagination combine — add `cursor` and `limit` alongside any filter to page through a filtered result set.

***

## Getting a single record

```bash theme={null}
curl "https://briksync.com/api/v1/properties/<property-id>" \
  -H "Authorization: Bearer $BRIKSYNC_API_KEY"
```

***

## Exact fields

The exact field list for every collection is published in the [API contract](/api/overview#the-api-contract) at `/api/v1/openapi.json`, and stays in sync automatically with what's live. Use it to confirm a field name or generate a client rather than relying on this page for the complete list.

***

## Next steps

<CardGroup cols={2}>
  <Card title="Suggesting Changes" icon="clipboard-check" href="/api/suggesting-changes">
    Propose a new record or an update — a person approves it before anything changes.
  </Card>

  <Card title="Errors & Limits" icon="gauge" href="/api/errors-and-limits">
    The error format, every error code, and rate limits.
  </Card>
</CardGroup>
