Skip to content

Calendar and iCal feeds

Two related surfaces: a JSON calendar for building your own day-by-day view, and an iCal feed for exporting availability into an OTA. If you don’t want to build your own calendar UI, a pre-built, copy-paste version of the JSON calendar is also available — see Embed the calendar.

GET /v1/resources/{id}/calendar returns one entry per night in the window: availability status, a price hint, and any active restrictions — built on the same data as Availability. It is a per-night view for hotel stays. To show the bookable times of an hourly space, use GET /v1/resources/{id}/slots. See Hourly spaces and services.

Terminal window
curl "https://api.<domain>/v1/resources/<RESOURCE_ID>/calendar?from=2026-08-01T00:00:00Z&to=2026-08-04T00:00:00Z" \
-H "Authorization: Bearer sk_test_..."
{
"resourceId": "<RESOURCE_ID>",
"from": "2026-08-01T00:00:00.000Z",
"to": "2026-08-04T00:00:00.000Z",
"currency": "IDR",
"days": [
{
"date": "2026-08-01",
"status": "available",
"reasons": [],
"priceHintMinorUnits": "1500000",
"restrictions": {
"minStayNights": 2,
"maxStayNights": null,
"closedToArrival": false,
"closedToDeparture": false,
"stopSell": false
}
}
]
}

Both sk_ and pk_ keys can call this endpoint. priceHintMinorUnits is a hint only — always price the actual stay with POST /v1/quotes (see Quotes) before you hold it.

The window is limited to 92 nights per call (400 range_too_large beyond that). Every response is computed fresh: there is no ETag and no 304 on this endpoint, so request only the window you need.

GET /v1/feeds/{token}.ics is built to export confirmed direct bookings and any already-synced external OTA blocks as an iCal feed — busy/free VEVENTs only, no guest names or contact details.

Terminal window
curl https://api.<domain>/v1/feeds/<TOKEN>.ics
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:...
DTSTART:20260801
DTEND:20260804
SUMMARY:Booked
END:VEVENT
END:VCALENDAR

The token itself is issued per resource with an sk_ key (channel:manage scope):

Terminal window
curl -X POST https://api.<domain>/v1/resources/<RESOURCE_ID>/feed-tokens \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{ "name": "Airbnb export" }'

POST /v1/resources/{id}/feed-tokens returns the full URL exactly once — copy it immediately, it is never shown again. If you don’t hold an sk_ key yourself, ask your operator contact to issue one for you. Losing a feed URL means revoking it (DELETE /v1/resources/{id}/feed-tokens/{tokenId}) and issuing a new one — the old URL stops working immediately, and nothing else about your API keys is affected.

iCal import (bringing an OTA’s calendar in)

Section titled “iCal import (bringing an OTA’s calendar in)”

The reverse direction — pulling an OTA’s own calendar in, so a booking made on that OTA blocks the date here too — is configured from the dashboard: Channels → Connect a channel → iCal calendar, then paste the URL the other site gives you. Once the connection is active we poll that URL on a short cycle and keep both calendars in sync; you don’t need to call anything for this to happen.

There is also a management API for it if you’d rather automate: GET/POST /v1/channel-connections and GET/POST /v1/channel-connections/{id}/listings.

iCal carries busy dates only. No prices, no restrictions, no guest details, no reservation records — and both sides poll on their own schedules, so the sync window is hours rather than seconds. That’s the trade for needing no partner agreement.

For rates, restrictions and real reservations you need a direct OTA integration. Booking.com and Agoda connections are not available yet either; see Connecting Booking.com and Agoda. Airbnb has no public API, so iCal will be the way to sync it once the channel manager is switched on.

  • Embed the calendar — a pre-built, copy-paste version of the JSON calendar above.
  • Availability — the underlying reason vocabulary shared with this endpoint.