For housing providersBookings & payouts

Bookings and payouts

What has been placed

GET /properties/bookings

Every 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 charged
  • platform_fee — Havnly’s service fee, taken from the rent only, never from a deposit, pet rent, utilities or one-time fees
  • net_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:

EventFires when
booking.confirmedA family is booked into one of your homes
booking.updatedA booking changes state, including cancellation
payment.succeededMoney reached your account, with the fee breakdown
payment.failedA charge did not go through

See Webhooks for the signature check.