Pagination and filters

Cursor pagination

Every list endpoint returns at most limit items (default 20, maximum 100) plus a pagination object:

{
  "data": [ … ],
  "pagination": { "has_more": true, "next_cursor": "eyJ0IjoxNzkwMDAwMDAwMDAwLCJpIjoiY20y…" }
}

To get the next page, repeat the same request with cursor=<next_cursor>. Stop when has_more is false.

curl "https://api.doolae.online/v1/bills?month=2026-10&limit=100" -H "Authorization: Bearer $DOOLAE_API_KEY"
curl "https://api.doolae.online/v1/bills?month=2026-10&limit=100&cursor=eyJ0Ijox…" -H "Authorization: Bearer $DOOLAE_API_KEY"
def all_bills(session, **filters):
    params = {"limit": 100, **filters}
    while True:
        body = session.get("https://api.doolae.online/v1/bills", params=params, timeout=30).json()
        yield from body["data"]
        if not body["pagination"]["has_more"]:
            return
        params["cursor"] = body["pagination"]["next_cursor"]

Lists are ordered by creation time, with the ID breaking ties. That order never changes, so no item is skipped or repeated while you page, even if new items arrive meanwhile. Use order=asc for oldest first (the default is desc, newest first).

Cursors are opaque: don't build or change them. Keep the same filters and order for every page. A cursor from a different order, or one that was edited, gets 400 invalid_cursor.

Filters

Only the filters listed for each endpoint are accepted. Any other query parameter gets 400 unknown_parameter, so a typo can't silently return everything.

Endpoint Filters
GET /v1/rooms property_id, status (vacant, occupied, maintenance)
GET /v1/tenants property_id, room_id
GET /v1/meter-readings property_id, room_id, month, from_month, to_month
GET /v1/bills property_id, room_id, tenant_id, status (draft, issued, paid, overdue), month, from_month, to_month, created_after, created_before
GET /v1/payments bill_id, status (pending, paid, expired, canceled), created_after, created_before
GET /v1/notifications tenant_id, bill_id, status (queued, sent, failed)
GET /v1/events type, created_after
  • Months use YYYY-MM. from_month and to_month are inclusive.
  • Times use ISO 8601, e.g. 2026-10-01T00:00:00Z. created_after is inclusive; created_before is exclusive.
# Overdue bills for one property
curl "https://api.doolae.online/v1/bills?property_id=prop_…&status=overdue" -H "Authorization: Bearer $DOOLAE_API_KEY"