Getting started
From zero to your first request in about five minutes.
1. Create a developer account and an application
- Sign in at developers.doolae.online with Google (the portal's only sign-in, separate from the DOOLAE landlord app), then complete your developer profile.
- Open Applications → New application. Name it, choose the scopes it needs (for example
properties:read,rooms:read,bills:read) and create it.
Every application gets a sandbox: a sample landlord account with two properties, eight rooms, tenants, two months of meter readings, bills and QR payments.
2. Create a test key
Open API keys, choose your application, keep Test selected and create the key. Copy it now; it is shown only once.
dl_test_7Kx2mQ9pR4tV8wY1zA3cE5gH6jL0nP2sU4xB7dF9
Keep keys on your server, in an environment variable or secret store. Never put them in browser code or in a repository.
3. Make your first request
cURL
curl https://api.doolae.online/v1/properties \
-H "Authorization: Bearer $DOOLAE_API_KEY"
JavaScript (Node.js 18+)
const res = await fetch("https://api.doolae.online/v1/properties", {
headers: { Authorization: `Bearer ${process.env.DOOLAE_API_KEY}` },
});
if (!res.ok) {
const { error } = await res.json();
throw new Error(`${error.code}: ${error.message} (${error.request_id})`);
}
const { data, pagination } = await res.json();
console.log(data.map((p) => p.name), pagination.has_more);
Python
import os, requests
res = requests.get(
"https://api.doolae.online/v1/properties",
headers={"Authorization": f"Bearer {os.environ['DOOLAE_API_KEY']}"},
timeout=30,
)
res.raise_for_status()
body = res.json()
print([p["name"] for p in body["data"]], body["pagination"]["has_more"])
PHP
<?php
$ch = curl_init("https://api.doolae.online/v1/properties");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("DOOLAE_API_KEY")],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$body = json_decode(curl_exec($ch), true);
foreach ($body["data"] as $property) echo $property["name"], "\n";
Response
{
"data": [
{
"id": "prop_cm2x8k1qz0001a8b3c4d5e6f7",
"object": "property",
"name": "Sandbox Residence",
"address": "123 Sandbox Road, Bang Rak, Bangkok 10500",
"electricity_rate": 800,
"water_billing": "metered",
"water_rate": 1800,
"water_flat_amount": null,
"due_day": 5,
"room_count": 6,
"created_at": "2026-10-07T03:15:00.000Z",
"updated_at": "2026-10-07T03:15:00.000Z"
}
],
"pagination": { "has_more": false, "next_cursor": null }
}
electricity_rate: 800 is ฿8.00 per kWh: every amount is in satang.
4. A typical month: readings → bill → payment
# Record a room's meter readings for October (previous values default to September's)
curl https://api.doolae.online/v1/meter-readings \
-H "Authorization: Bearer $DOOLAE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 4b7f0c1e-9d2a-4c55-8e3b-2f6a1d9c7e10" \
-d '{"room_id": "room_…", "month": "2026-10", "electricity": {"current": 1290.5}, "water": {"current": 312}}'
# Create the room's October bill from that reading
curl https://api.doolae.online/v1/bills \
-H "Authorization: Bearer $DOOLAE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"room_id": "room_…", "month": "2026-10"}'
# Send the bill to the tenant on LINE (with a PromptPay QR if the landlord uses QR payments)
curl https://api.doolae.online/v1/notifications \
-H "Authorization: Bearer $DOOLAE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "new_bill", "bill_id": "bill_…"}'
In test mode, simulate the tenant paying:
curl https://api.doolae.online/v1/test-helpers/payments \
-H "Authorization: Bearer $DOOLAE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"bill_id": "bill_…", "outcome": "paid"}'
The bill becomes paid, and your webhook endpoints receive payment.pending, payment.paid and bill.updated (see webhooks).
5. Go live
Live keys reach only DOOLAE accounts linked to your application, and you can't create one until an account is linked.
- Link an account. On the application's page, choose Link DOOLAE Account. The account's owner signs in to DOOLAE and approves, and the portal finishes the link. Use this for an account you can sign in to yourself.
- Or have your customers connect from your app. Add your production redirect URI to the application (Applications → your app → Settings). Then send landlords the connect link with that
redirect_uriand a randomstate. When they approve, DOOLAE redirects to your URI withaccount_id=acct_…&state=…. Check that the state matches the one you sent. - Create a live key. Either bind it to one linked account, or send
DOOLAE-Account: acct_…with each request. The header only selects a linked account; an account ID on its own gives no access.
See authentication for the details, and rate limits before you send real traffic.