Bookings and payouts
What has been placed
GET /properties/bookingsEvery booking across your portfolio, newest first, with what each one earned:
{
"data": [
{
"id": "b2f1…",
"property_id": "4e2ec10b-…",
"property": { "name": "Riverside 2BR", "api_external_id": "PM-1001" },
"booking_status": "confirmed",
"check_in": "2026-11-01",
"check_out": "2027-01-31",
"move_in_confirmed_at": "2026-11-01T16:04:00Z",
"payments": [
{
"charge_type": "initial",
"gross": 4900,
"platform_fee": 408,
"net_to_you": 4451.30,
"currency": "usd",
"paid_at": "2026-10-28T11:22:00Z"
}
]
}
]
}gross— what the payer was chargedplatform_fee— Havnly’s service fee, taken from the rent only, never from a deposit, pet rent, utilities or one-time feesnet_to_you— what reached your account after the platform fee and the card processing fee
Payouts
GET /properties/payouts{
"data": {
"connected": true,
"onboarding_status": "complete",
"charges_enabled": true,
"payouts_enabled": true,
"bank_account_last4": "4321",
"finish_setup_url": "https://app.havnly.ai/owners/payments"
}
}charges_enabled is the one that matters. Rent is charged directly on your
own Stripe account, so until it is true a family cannot be placed in your homes
— there is nowhere for the money to go.
Why setup is not an API call
Your bank details and identity are collected by Stripe, in a browser, under
their KYC obligations. Havnly never sees them and never holds your money, which
is also why we cannot complete that step for you. finish_setup_url is where
someone at your company finishes it once.
Webhooks
Rather than polling for any of this, subscribe:
| Event | Fires when |
|---|---|
booking.confirmed | A family is booked into one of your homes |
booking.updated | A booking changes state, including cancellation |
payment.succeeded | Money reached your account, with the fee breakdown |
payment.failed | A charge did not go through |
See Webhooks for the signature check.