What you can do through the API
Permissions
- Hours, schedules, open houses, reports and projects need
listings:readto read andlistings:writeto change. - Anything about a person also needs the requests’ permissions:
leads:readto see the client who booked (visitor), a client added by hand, the attendees of an open house and the note from “How did it go?”, andleads:writeto add a client or an attendee, to work on the attendance sheet and to record how a viewing went. A key withoutleads:readgetsvisitor: nulland does not see the attendance sheet. The listing’s report holds no people, so any key withlistings:readreads it. - A key sees the viewings its account runs in the app: the listings it manages, those whose viewings were handed to it and, at a developer, the bookings that reached it as a consultant. Outside them the answer is
404.
How long the data is kept
Data read through the API has the same terms as in the app. The name and phone of a client added by hand are removed from the viewing after 90 days. The rows of an attendance sheet are deleted 90 days after the open house, and the window stays. The answer to “How did it go?” and its note are deleted after 24 months. An owner’s link works for 90 days at most. The contact you keep in the requests has its own term. If you keep this data in your system, delete it on the same terms.What stays in the app only
- The client’s side: booking, holding the hour while they sign in, the cancelling and moving they do, “I’m coming too” for an open house, the form at the door, their private note, “My viewings”, the calendar file and the “Still coming?” link in the email. Your key works for the person who publishes the listing and cannot act on the client’s behalf. You learn what the client does from the events. For a client who called you, use the client added by hand.
- Messages to people: confirmations, reminders and the day’s agenda are sent by the app, also when the action comes through the API.
- The printable open house poster. The API gives you the link to the sheet at the door, and you draw the QR code yourself.
The agenda
GET /account/listings/{code}/viewings returns the settings, plus the viewing times and open house windows that have not passed yet:
kindisviewing(a time one visitor books) oropen_house(an open house window, with no booking).statusisavailable(free),pending(requested by a visitor, waiting for your answer) orbooked.request_expires_atis when you have to answer a request by. After it, the request expires and the time is free again.visitorhas the name, email and phone of the person who booked or requested the time. Only a key with theleads:readpermission gets it, since it is the same data as a client request. For other keys it isnull. A booking also brings a new request, withsource: viewing_request.
source, bookable, outcome, agent, open_house and others). They are described in Viewing agenda. On this endpoint status stays available, pending or booked, and an hour that has passed no longer appears.
Every change below answers with the updated agenda, in the same shape.
Settings
PATCH /listings/{code}/viewings changes one or both settings:
duration_minis how long a viewing lasts, in minutes: 15, 30, 45, 60 or 90. Times already published keep their length.confirmationisauto(a booking is confirmed at once) ormanual(the visitor sends a request, and you accept or decline it).
Viewing times and open house days
POST /listings/{code}/viewings publishes viewing times, at most 400 in one request:
POST /listings/{code}/open-house publishes open house windows, at most 60 in one request:
- A time without a time zone (
2026-11-12T10:00) is read on the clock of the listing’s location, as the visitor sees it. You can also send a moment with an offset (2026-11-12T08:00:00Z). A time that does not exist, or happens twice when the clocks change, is refused. - Times must be in the future, and a window ends after it starts.
- Viewing times do not overlap each other or an open house window. A time already published is skipped, so the same list sent twice adds nothing.
- A
duration_minsent when publishing becomes the listing’s duration. With"set_listing_duration": false, the times are published with their own duration and the listing’s stays as it was. - The agenda changes only on an
activelisting. On any other listing the response is409 listing_action_refused.
PATCH /viewings/{id} moves a viewing time or a window (starts_at, plus ends_at for a window). A time booked by a client with an account is not moved: you propose another time (Viewing agenda), cancel it or answer the request. The viewing of a client without an account, added by hand, is moved directly, since you agreed the new time together.
DELETE /viewings/{id} withdraws a time or a window (204). If the time was booked or requested, the visitor is told. POST /listings/{code}/viewings/withdraw with {"slot_ids": [9182, 9183]} withdraws several free times at once. Booked or requested times stay, and you withdraw them one by one.
Requests and bookings
POST /viewings/{id}/acceptaccepts a request: the time becomesbooked, and the visitor gets the confirmation.POST /viewings/{id}/declinedeclines a request: the time is free again, and the visitor learns the request was declined.POST /viewings/{id}/cancelcancels a booking or a request: the time stays published and free, and the visitor is told. Withnote(at most 300 characters), the note goes into the message to them, if they have an account.
409 listing_action_refused. A time on a listing the key cannot see answers 404.
A developer’s consultant answers the bookings that came to them on a project the same way. The answer is the listing’s agenda with the times they see in the app: their clients and the open house days. The whole agenda (GET /account/listings/{code}/viewings), moving times and withdrawing them stay with whoever runs the listing’s viewings. The consultant finds their times in GET /account/viewings.
Events
viewing.booked: a visitor booked or requested a viewing time.datahasslot_id,starts_atandslot_status(bookedorpending).viewing.cancelled: a booking or a request was cancelled without you.datahasslot_id,starts_atandby:visitorwhen the visitor cancelled,expiredwhen the request expired without an answer.
listings:read permission. From the day we announce to you, you also get the events for what your colleague does in the app (confirms, declines, cancels, moves, proposes another hour, says how it went) and for the attendance sheet. See Viewing events.