Skip to content
Developers
esc
  • Type an endpoint, an object or a word from a guide.

Reservations

List reservations

GET /api/v1/reservations

Offset pagination on a stable order: the sort key, then id. total counts the same filters, so you can page to the end without probing.

Query parameters

ParameterInTypeDescription
status querystringComma-separated: option, reserved, confirmed, cancelled. Default all.
propertyId querystringOne property.
startFrom querydateInclusive lower bound on the start date. YYYY-MM-DD
startTo querydateInclusive upper bound on the start date. YYYY-MM-DD
endFrom querydateInclusive lower bound on the end date. YYYY-MM-DD
endTo querydateInclusive upper bound on the end date. YYYY-MM-DD
updatedSince querytimestampOnly bookings changed at or after this instant. For an incremental sync, keep the updatedAt of the last row you saw and ask from there. ISO 8601
sort queryenumDefault startDate. "startDate""endDate""updatedAt""createdAt"
order queryenumDefault asc. "asc""desc"
limit queryinteger1–100, default 25. 1–100
skip queryintegerRows to skip, default 0. min 0

Response

200 { reservations: Reservation[], total: integer, limit: integer, skip: integer }

Reservation fields
FieldTypeDescription
id stringOpaque.
status ReservationStatus
propertyId string
property PropertyIdentity | null
guest Guest
onContract Party
staying Party
startDate date YYYY-MM-DD
endDate dateExclusive. YYYY-MM-DD
nights integerThe booking’s end minus its start.
adults integer | null
children integer | null
infants integer | null
pets boolean
petDetails string | nullWhat the pet is, as the team wrote it. Null without a pet.
pricing objectSnapshotted when the booking was made. A later rate change on the listing never rewrites an agreed booking.
currency "EUR"
rateBasis enumWhat rentCents is per: the property's basis when the booking was made, unless the booking was set to the other. "monthly""nightly"
rentCents integer | nullRent as agreed, per rateBasis: a month or a night. Integer euro-cents.
utilitiesCents integer | nullMonthly utilities as agreed. Integer euro-cents.
furnitureCents integer | nullMonthly furniture fee as agreed. Integer euro-cents.
monthlyCents integer | nullRent + utilities + furniture, for a monthly booking. Null for a nightly one. Integer euro-cents.
depositCents integer | nullSecurity deposit as agreed. Integer euro-cents.
minStayMonths integer | nullWhat the agreement states as the minimum term.
requiresContract booleanWhether this booking needs a signed agreement before it counts as confirmed. Worked out on each request, so a change to what decides it does not move updatedAt.
agreement Agreement | null
dashboardUrl urlOpens the same record in the dashboard, for an alert email or a back-office link.
optionAt timestamp | nullWhen the status was entered. Never cleared. ISO 8601
reservedAt timestamp | nullWhen the status was entered. Never cleared. ISO 8601
confirmedAt timestamp | nullWhen the status was entered. Never cleared. ISO 8601
cancelledAt timestamp | nullWhen the status was entered. Never cleared. ISO 8601
createdAt timestamp ISO 8601
updatedAt timestampThe incremental-sync key: see updatedSince on the list. ISO 8601

Errors

Every failure is { error, message }; see Errors. A missing or expired bearer is a 401 on every endpoint but the token exchange.

StatuserrorWhen
400invalid_requestAn unknown status, a malformed date or timestamp, a sort key that does not exist.

Request

curl "https://go.quarters.live/api/v1/reservations?status=reserved,confirmed&startFrom=2026-10-01&limit=50" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
const res = await fetch("https://go.quarters.live/api/v1/reservations?status=reserved,confirmed&startFrom=2026-10-01&limit=50", {
  headers: { Authorization: `Bearer ${token}` }
});
const data = await res.json();
import requests

res = requests.get(
    "https://go.quarters.live/api/v1/reservations",
    params={
      "status": "reserved,confirmed",
      "startFrom": "2026-10-01",
      "limit": "50",
    },
    headers={"Authorization": f"Bearer {token}"},
)
res.raise_for_status()
data = res.json()
$ch = curl_init("https://go.quarters.live/api/v1/reservations?status=reserved,confirmed&startFrom=2026-10-01&limit=50");
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["Authorization: Bearer $token"],
]);
$res = curl_exec($ch);
curl_close($ch);
$data = json_decode($res, true);
require "net/http"
require "json"

uri = URI("https://go.quarters.live/api/v1/reservations?status=reserved,confirmed&startFrom=2026-10-01&limit=50")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{token}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

func main() {
	token := os.Getenv("ACCESS_TOKEN")
	req, _ := http.NewRequest("GET", "https://go.quarters.live/api/v1/reservations?status=reserved,confirmed&startFrom=2026-10-01&limit=50", nil)
	req.Header.Set("Authorization", "Bearer "+token)
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	var data map[string]any
	json.NewDecoder(res.Body).Decode(&data)
	fmt.Println(data)
}

Response · 200

{
  "reservations": [
    {
      "id": "7c02…",
      "status": "reserved",
      "propertyId": "0d6e1c2a-…",
      "property": {
        "id": "0d6e1c2a-…",
        "nickname": "JOR-1A",
        "slug": "jordaan-canal-loft",
        "address": {
          "street": "Prinsengracht 123",
          "postalCode": "1015 DX",
          "city": "Amsterdam",
          "country": "NL"
        },
        "ownerName": "A. de Vries",
        "timezone": "Europe/Amsterdam"
      },
      "guest": {
        "id": "e31f…",
        "firstName": "Sofia",
        "lastName": "Rossi",
        "name": "Sofia Rossi",
        "email": "sofia@example.com",
        "phone": "+39 333 000 0000",
        "company": null
      },
      "onContract": {
        "name": "Sofia Rossi",
        "email": "sofia@example.com",
        "phone": "+39 333 000 0000",
        "company": null
      },
      "staying": {
        "name": "Sofia Rossi",
        "email": "sofia@example.com",
        "phone": "+39 333 000 0000",
        "company": null
      },
      "startDate": "2026-10-01",
      "endDate": "2027-04-01",
      "nights": 182,
      "adults": 2,
      "children": 0,
      "infants": 0,
      "pets": false,
      "petDetails": null,
      "pricing": {
        "currency": "EUR",
        "rateBasis": "monthly",
        "rentCents": 240000,
        "utilitiesCents": 15000,
        "furnitureCents": 25000,
        "monthlyCents": 280000,
        "depositCents": 240000,
        "minStayMonths": 6
      },
      "requiresContract": true,
      "agreement": null,
      "dashboardUrl": "https://go.quarters.live/acme/reservations?reservation=7c02…",
      "optionAt": "2026-09-01T14:20:05.000Z",
      "reservedAt": "2026-09-08T09:58:40.000Z",
      "confirmedAt": null,
      "cancelledAt": null,
      "createdAt": "2026-09-01T14:20:05.000Z",
      "updatedAt": "2026-09-08T09:58:40.000Z"
    }
  ],
  "total": 132,
  "limit": 50,
  "skip": 0
}