iCal Sandbox
API DocsFree & Open

API Documentation

All endpoints accept and return JSON. No authentication is needed to read feeds. Write operations require the feed's secret token.

POST/api/feeds

Create 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.

GET/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
}
PUT/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
}
POST/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" }
}
GET/ical/{id}.ics

Serve 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.

GET/api/scenarios

List Scenarios

Returns the list of available preset scenarios.

Response

[
  { "id": "simple-stay", "name": "Simple Stay", "description": "..." },
  { "id": "overlap", "name": "Overlapping Bookings", "description": "..." },
  ...
]