Errors

Every error has the same shape and a stable code. Branch on the code: messages may be reworded.

{
  "error": {
    "code": "insufficient_scope",
    "message": "This endpoint requires the bills:read scope.",
    "request_id": "req_3f2a9c1d7b8e4f60a1b2c3d4e5f60718",
    "required_scope": "bills:read",
    "doc_url": "https://developers.doolae.online/docs/guides/errors#insufficient_scope"
  }
}
Field Meaning
request_id Also in the X-Request-ID header of every response. Quote it when you contact support.
param The parameter at fault, when there is one.
existing_id, required_scope Extra detail some errors add.

An ID that belongs to another landlord's account gets exactly the same 404 resource_not_found as an ID that doesn't exist.

400 Bad Request

invalid_request

The request couldn't be understood. Check the method, path and body.

invalid_json

The body isn't valid JSON.

unknown_parameter

A query parameter or body field the endpoint doesn't accept. param names it. Fields like id or status: "paid" are never accepted in a body.

invalid_parameter

A parameter has an invalid value: wrong type, out of range, wrong format. param names it, and message says why.

invalid_cursor

The pagination cursor was changed, or belongs to a request with a different order. Start again without cursor.

api_key_in_query

The key was sent in the URL. Send it in the Authorization header, and rotate the exposed key.

invalid_idempotency_key

Idempotency-Key must be 1–255 printable ASCII characters.

account_header_invalid

DOOLAE-Account must be an account ID such as acct_….

401 Unauthorized

missing_api_key

No Authorization: Bearer … header was sent.

invalid_api_key

The key is malformed or unknown.

api_key_revoked

The key was revoked, its application was deleted, or the developer account was closed.

api_key_expired

The key reached its expiry date, or the 24 hours after a rotation have passed. Use the new key.

402 Payment Required

payment_required

Live mode only: an invoice for your developer account is overdue. Pay it under Billing in the portal. Test mode keeps working.

403 Forbidden

insufficient_scope

The key, the application or the landlord's grant doesn't include the scope in required_scope.

account_required

This live key isn't bound to one account. Send DOOLAE-Account: acct_….

account_not_connected

That account isn't linked to this application (or doesn't exist: the answer is the same), or a test key was used with another account. Knowing an account ID never grants access.

account_access_revoked

The landlord disconnected your application. Ask them to connect again if they want to.

account_mismatch

The key is bound to a different account than the one in DOOLAE-Account.

developer_suspended

DOOLAE suspended your developer account. Contact support.

application_disabled

DOOLAE disabled this application. Contact support.

origin_not_allowed

A browser request came from an origin the application doesn't allow. See security.

test_mode_only

The endpoint (for example /v1/test-helpers/payments) only works with a test key.

plan_limit_reached

The landlord's DOOLAE plan doesn't allow more properties, rooms or tenants. The landlord can upgrade at doolae.online.

feature_not_available

The landlord's DOOLAE plan doesn't include the feature, for example LINE messages.

404 Not Found

resource_not_found

No such object in this account.

route_not_found

No endpoint exists at this path. Check the path and the /v1 prefix.

405 Method Not Allowed

method_not_allowed

The path exists, but not with this method. The Allow header lists the methods it supports.

409 Conflict

conflict

Something changed at the same moment (for example a payment arrived). Fetch the object again and retry.

idempotency_in_progress

A request with this Idempotency-Key is still running. Retry shortly.

resource_exists

A meter reading or bill already exists for that room and month. existing_id points to it.

room_number_taken

The property already has a room with that number.

room_occupied

The room already has a tenant. Move them out first.

room_has_no_tenant

A bill needs a tenant in the room.

reading_required

Record the month's meter reading before creating its bill.

reading_locked

The month's bill is paid, so its reading can't change.

bill_locked

The bill is paid and can't change.

bill_not_payable

The bill can't be paid now: it is a draft, or QR payments aren't available for this landlord.

property_not_empty

Only a property without rooms can be deleted through the API.

413, 415, 422

request_too_large

The body is over 1 MB.

unsupported_media_type

Send bodies as Content-Type: application/json.

idempotency_key_reused

This Idempotency-Key was used with a different request. Use a new key for a new operation.

invalid_reading

A meter value is lower than the previous one, or the water value is missing for metered water. If a meter was replaced, send previous explicitly.

429 Too Many Requests

rate_limited

Over your per-second limit. Wait Retry-After seconds. See rate limits.

monthly_quota_exceeded

The Free plan's monthly requests are used up. They reset on the 1st; or upgrade.

too_many_failed_attempts

Too many requests with invalid keys came from your IP address. Wait a minute and check your key.

sending_limit

Too many LINE messages for this account in the last minute. Wait Retry-After seconds.

sandbox_limit

The sandbox is full (20 properties, 500 rooms), or you made 20,000 test requests today. Reset the sandbox in the portal.

500 and 503

internal_error

Something went wrong on DOOLAE's side and has been logged. Retry with backoff; contact support with the request_id if it persists.

service_unavailable

DOOLAE is briefly overloaded, or a dependency (such as LINE) is unavailable. Retry after Retry-After seconds.

timeout

The request took longer than 25 seconds. If it was a write, retry with the same Idempotency-Key: you will get its real result once it finishes.

api_not_configured

The server is missing its API configuration. This should never happen in production; contact support.