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_monthandto_monthare inclusive. - Times use ISO 8601, e.g.
2026-10-01T00:00:00Z.created_afteris inclusive;created_beforeis exclusive.
# Overdue bills for one property
curl "https://api.doolae.online/v1/bills?property_id=prop_…&status=overdue" -H "Authorization: Bearer $DOOLAE_API_KEY"