External calendars
Imported iCal calendars, for syncing bookings with platforms like Airbnb or Booking.com
The external calendar object
Attributes
iduuidUnique identifier
created_atread-onlytimestamp with time zoneCreation timestamp
updated_atread-onlytimestamp with time zone | nullTimestamp at which the calendar last received new events
activeread-onlybooleanWhether the calendar is synced, i.e. it is not deactivated
deactivated_attimestamp with time zone | nullTimestamp at which the import was deactivated
errortext | nullError message if the calendar could not be synced
event_status_syncEventStatusSyncHow to treat incoming events
ical_urltextURL of the iCal feed
last_syncedtimestamp with time zone | nullTimestamp at which the calendar was last synced
nametextName of the calendar
sync_requested_attimestamp with time zoneTimestamp at which a sync was last requested
time_offsetintegerTime offset of the calendar in hours
tldtextTop-level domain of the iCal feed URL
Related resources
Embed related resources in the response with the select parameter, for example select=*,products!product_id(*). Resources related through more than one column need the column as a hint, like table!column(*).
calendar_events(*)arrayThe calendar events referencing this external calendar through calendar_events.calendar_id.
{
"id": "00000000-0000-0000-0000-000000000000",
"product_id": "00000000-0000-0000-0000-000000000000",
"created_at": "2026-10-30T22:27:57.861Z",
"updated_at": "2026-10-30T22:27:57.861Z",
"active": false,
"deactivated_at": "2026-10-30T22:27:57.861Z",
"error": "",
"event_status_sync": "import",
"ical_url": "https://example.com",
"last_synced": "2026-10-30T22:27:57.861Z",
"name": "Nameless iCal import",
"sync_requested_at": "2026-10-30T22:27:57.861Z",
"time_offset": 0,
"tld": ""
}curl -X GET "https://api.bookingmood.com/v1/external_calendars?limit=10&select=*,products!product_id(*),calendar_events(*)" \
-H "Authorization: Bearer YOUR_API_KEY"List external calendars
Filters
idFilter<uuid>Unique identifier
created_atFilter<timestamp with time zone>Creation timestamp
updated_atFilter<timestamp with time zone | null>Timestamp at which the calendar last received new events
activeFilter<boolean>Whether the calendar is synced, i.e. it is not deactivated
deactivated_atFilter<timestamp with time zone | null>Timestamp at which the import was deactivated
errorFilter<text | null>Error message if the calendar could not be synced
event_status_syncFilter<EventStatusSync>How to treat incoming events
ical_urlFilter<text>URL of the iCal feed
last_syncedFilter<timestamp with time zone | null>Timestamp at which the calendar was last synced
nameFilter<text>Name of the calendar
sync_requested_atFilter<timestamp with time zone>Timestamp at which a sync was last requested
time_offsetFilter<integer>Time offset of the calendar in hours
tldFilter<text>Top-level domain of the iCal feed URL
Responses
200A list of external calendars with the selected columns
206Partial Content
400The request is malformed, for example an unknown column or an invalid filter.
401The API key is missing or invalid.
code, message, details and hint. See the introduction for more on errors.GET /external_calendarscurl -X GET "https://api.bookingmood.com/v1/external_calendars?select=*&limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"[
{
"id": "00000000-0000-0000-0000-000000000000",
"product_id": "00000000-0000-0000-0000-000000000000",
"created_at": "2026-10-30T22:27:57.861Z",
"updated_at": "2026-10-30T22:27:57.861Z",
"active": false,
"deactivated_at": "2026-10-30T22:27:57.861Z",
"error": "",
"event_status_sync": "import",
"ical_url": "https://example.com",
"last_synced": "2026-10-30T22:27:57.861Z",
"name": "Nameless iCal import",
"sync_requested_at": "2026-10-30T22:27:57.861Z",
"time_offset": 0,
"tld": ""
}
]Create external calendars
Body
Partial<ExternalCalendar> | Array<Partial<ExternalCalendar>>Read-only attributes are set by the database and can't be written.
Responses
201The newly created external calendars with the selected columns
400The request is malformed, for example an unknown column, an invalid filter or an invalid body.
401The API key is missing or invalid.
403The API key has no permission for this change, for example when writing rows of another organization.
409The change conflicts with existing data, for example a duplicate key or a reference to a row that does not exist.
code, message, details and hint. See the introduction for more on errors.POST /external_calendarscurl -X POST "https://api.bookingmood.com/v1/external_calendars" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_status_sync": "import",
"ical_url": "https://example.com",
"name": "Nameless iCal import",
"product_id": "00000000-0000-0000-0000-000000000000",
"sync_requested_at": "2026-10-30T22:27:57.861Z",
"time_offset": 0,
"tld": ""
}'[
{
"id": "00000000-0000-0000-0000-000000000000",
"product_id": "00000000-0000-0000-0000-000000000000",
"created_at": "2026-10-30T22:27:57.861Z",
"updated_at": "2026-10-30T22:27:57.861Z",
"active": false,
"deactivated_at": "2026-10-30T22:27:57.861Z",
"error": "",
"event_status_sync": "import",
"ical_url": "https://example.com",
"last_synced": "2026-10-30T22:27:57.861Z",
"name": "Nameless iCal import",
"sync_requested_at": "2026-10-30T22:27:57.861Z",
"time_offset": 0,
"tld": ""
}
]Delete external calendars
Filters
Without filters, this request deletes all external calendars you have access to. Always filter on at least one column, e.g. id=eq.{id}.
idFilter<uuid>Unique identifier
created_atFilter<timestamp with time zone>Creation timestamp
updated_atFilter<timestamp with time zone | null>Timestamp at which the calendar last received new events
activeFilter<boolean>Whether the calendar is synced, i.e. it is not deactivated
deactivated_atFilter<timestamp with time zone | null>Timestamp at which the import was deactivated
errorFilter<text | null>Error message if the calendar could not be synced
event_status_syncFilter<EventStatusSync>How to treat incoming events
ical_urlFilter<text>URL of the iCal feed
last_syncedFilter<timestamp with time zone | null>Timestamp at which the calendar was last synced
nameFilter<text>Name of the calendar
sync_requested_atFilter<timestamp with time zone>Timestamp at which a sync was last requested
time_offsetFilter<integer>Time offset of the calendar in hours
tldFilter<text>Top-level domain of the iCal feed URL
Responses
200The deleted external calendars with the selected columns. Returns 204 without a body when sending the header Prefer: return=minimal.
400The request is malformed, for example an unknown column or an invalid filter.
401The API key is missing or invalid.
403The API key has no permission for this change, for example when writing rows of another organization.
code, message, details and hint. See the introduction for more on errors.DELETE /external_calendarscurl -X DELETE "https://api.bookingmood.com/v1/external_calendars?id=eq.00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer YOUR_API_KEY"[
{
"id": "00000000-0000-0000-0000-000000000000",
"product_id": "00000000-0000-0000-0000-000000000000",
"created_at": "2026-10-30T22:27:57.861Z",
"updated_at": "2026-10-30T22:27:57.861Z",
"active": false,
"deactivated_at": "2026-10-30T22:27:57.861Z",
"error": "",
"event_status_sync": "import",
"ical_url": "https://example.com",
"last_synced": "2026-10-30T22:27:57.861Z",
"name": "Nameless iCal import",
"sync_requested_at": "2026-10-30T22:27:57.861Z",
"time_offset": 0,
"tld": ""
}
]Update external calendars
Filters
Without filters, this request updates all external calendars you have access to. Always filter on at least one column, e.g. id=eq.{id}.
idFilter<uuid>Unique identifier
created_atFilter<timestamp with time zone>Creation timestamp
updated_atFilter<timestamp with time zone | null>Timestamp at which the calendar last received new events
activeFilter<boolean>Whether the calendar is synced, i.e. it is not deactivated
deactivated_atFilter<timestamp with time zone | null>Timestamp at which the import was deactivated
errorFilter<text | null>Error message if the calendar could not be synced
event_status_syncFilter<EventStatusSync>How to treat incoming events
ical_urlFilter<text>URL of the iCal feed
last_syncedFilter<timestamp with time zone | null>Timestamp at which the calendar was last synced
nameFilter<text>Name of the calendar
sync_requested_atFilter<timestamp with time zone>Timestamp at which a sync was last requested
time_offsetFilter<integer>Time offset of the calendar in hours
tldFilter<text>Top-level domain of the iCal feed URL
Body
Partial<ExternalCalendar>Read-only attributes are set by the database and can't be written.
Responses
200The updated external calendars with the selected columns. Returns 204 without a body when sending the header Prefer: return=minimal.
400The request is malformed, for example an unknown column, an invalid filter or an invalid body.
401The API key is missing or invalid.
403The API key has no permission for this change, for example when writing rows of another organization.
409The change conflicts with existing data, for example a duplicate key or a reference to a row that does not exist.
code, message, details and hint. See the introduction for more on errors.PATCH /external_calendarscurl -X PATCH "https://api.bookingmood.com/v1/external_calendars?id=eq.00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_status_sync": "import"
}'[
{
"id": "00000000-0000-0000-0000-000000000000",
"product_id": "00000000-0000-0000-0000-000000000000",
"created_at": "2026-10-30T22:27:57.861Z",
"updated_at": "2026-10-30T22:27:57.861Z",
"active": false,
"deactivated_at": "2026-10-30T22:27:57.861Z",
"error": "",
"event_status_sync": "import",
"ical_url": "https://example.com",
"last_synced": "2026-10-30T22:27:57.861Z",
"name": "Nameless iCal import",
"sync_requested_at": "2026-10-30T22:27:57.861Z",
"time_offset": 0,
"tld": ""
}
]