API Documentation
All endpoints accept and return JSON. No authentication is needed to read feeds. Write operations require the feed's secret token.
/api/feedsCreate a Feed
Create a new test feed. Optionally pick a preset scenario.
Request body
{
"name": "My Test Feed", // optional, max 100 chars
"scenario": "simple-stay" // optional, preset scenario ID
}Response (201)
{
"id": "a1b2c3d4e5",
"secret": "xyzSecret20Chars...",
"name": "My Test Feed",
"url": "/ical/a1b2c3d4e5.ics",
"expiresAt": "2026-04-27T..."
}Rate limit: 10 feeds/hour, 20 total per IP. Save the secret — it's only returned once.
/api/feed/{id}Get Feed Details
Retrieve feed metadata, versions, and events. Send the secret via Authorization header to get write access confirmation.
Authorization header
Authorization: Bearer <secret>
Response
{
"id": "a1b2c3d4e5",
"name": "My Test Feed",
"activeVersion": 0,
"versions": [...],
"accessLog": [...],
"authorized": true
}/api/feed/{id}Update Feed
Rename the feed or switch the active version.
Request body
{
"secret": "<secret>",
"name": "New Name", // optional
"activeVersion": 1 // optional, version ID
}/api/feed/{id}Event Operations
Add, update, or delete events. All require secret in the body.
Add Event
{
"action": "add-event",
"secret": "<secret>",
"summary": "Booking – Guest A",
"dtstart": "2026-04-01",
"dtend": "2026-04-04",
"type": "booking", // booking | manual-block | maintenance | test-overlap
"status": "CONFIRMED", // CONFIRMED | TENTATIVE | CANCELLED
"description": "Optional"
}Update Event
{
"action": "update-event",
"secret": "<secret>",
"uid": "<event-uid>",
"dtstart": "2026-04-02", // any field is optional
"status": "CANCELLED"
}Delete Event
{ "action": "delete-event", "secret": "<secret>", "uid": "<event-uid>" }Create Version
{
"action": "create-version",
"secret": "<secret>",
"label": "After Cancellation",
"sourceVersion": 0 // optional, copies events from this version
}Import .ics
{
"action": "import-ics",
"secret": "<secret>",
"icsContent": "BEGIN:VCALENDAR\n..."
}Clone Feed
{ "action": "clone", "secret": "<secret>" }Schedule Change
{
"action": "schedule-change",
"secret": "<secret>",
"uid": "<event-uid>",
"delayMinutes": 10,
"changes": { "status": "CANCELLED" }
}/ical/{id}.icsServe iCal Feed
Returns the active version as a valid text/calendar response. Subscribe from any PMS or calendar app. No authentication required.
Response headers
Content-Type: text/calendar; charset=utf-8 Cache-Control: no-cache, no-store, must-revalidate X-Feed-Modified: 2026-03-28T12:00:00Z X-Feed-Version: 0
You can control caching behavior via feed response header settings.
/api/scenariosList Scenarios
Returns the list of available preset scenarios.
Response
[
{ "id": "simple-stay", "name": "Simple Stay", "description": "..." },
{ "id": "overlap", "name": "Overlapping Bookings", "description": "..." },
...
]