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

Listings

Retrieve live availability

GET /api/v1/listings/{id}/calendar

Per-day availability, computed on request from reservations and calendar blocks. The one read not bound to a snapshot, so a booking made thirty seconds ago already shows.

Path parameters

ParameterInTypeDescription
id requiredpathstringThe listing id. It must be published.

Query parameters

ParameterInTypeDescription
start querydateDefaults to today in the listing’s timezone. YYYY-MM-DD
end querydateInclusive. Defaults to start + 730 days. The range may span at most 1100 days. YYYY-MM-DD

Response

200 { days: CalendarDay[] }

CalendarDay fields
FieldTypeDescription
date date YYYY-MM-DD
status enumbooked is a confirmed tenancy; reserved is held but not yet firm; unavailable is a calendar block such as a renovation; available is bookable. "available""reserved""booked""unavailable"
minNights integerThe listing’s base minimum.
isBaseMinNights booleanAlways true.

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_requestA date that is not YYYY-MM-DD, end before start, or a span over 1100 days.
404not_foundUnknown or unpublished listing.

Notes

  • Inquiries and options never block a day. Cancelling releases the days immediately.
  • A tenancy’s end date is exclusive. One ending on the 30th leaves the 30th available.

Request

curl "https://go.quarters.live/api/v1/listings/0d6e1c2a-…/calendar?start=2026-10-01&end=2026-10-04" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
const res = await fetch("https://go.quarters.live/api/v1/listings/0d6e1c2a-…/calendar?start=2026-10-01&end=2026-10-04", {
  headers: { Authorization: `Bearer ${token}` }
});
const { days } = await res.json();
import requests

res = requests.get(
    "https://go.quarters.live/api/v1/listings/0d6e1c2a-…/calendar",
    params={
      "start": "2026-10-01",
      "end": "2026-10-04",
    },
    headers={"Authorization": f"Bearer {token}"},
)
res.raise_for_status()
days = res.json()["days"]
$ch = curl_init("https://go.quarters.live/api/v1/listings/0d6e1c2a-…/calendar?start=2026-10-01&end=2026-10-04");
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["Authorization: Bearer $token"],
]);
$res = curl_exec($ch);
curl_close($ch);
$days = json_decode($res, true)["days"];
require "net/http"
require "json"

uri = URI("https://go.quarters.live/api/v1/listings/0d6e1c2a-…/calendar?start=2026-10-01&end=2026-10-04")
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) }
days = JSON.parse(res.body)["days"]
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/listings/0d6e1c2a-…/calendar?start=2026-10-01&end=2026-10-04", 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["days"])
}

Response · 200

{
  "days": [
    {
      "date": "2026-10-01",
      "status": "booked",
      "minNights": 30,
      "isBaseMinNights": true
    },
    {
      "date": "2026-10-02",
      "status": "reserved",
      "minNights": 30,
      "isBaseMinNights": true
    },
    {
      "date": "2026-10-03",
      "status": "unavailable",
      "minNights": 30,
      "isBaseMinNights": true
    },
    {
      "date": "2026-10-04",
      "status": "available",
      "minNights": 30,
      "isBaseMinNights": true
    }
  ]
}