REST API
A JSON API for calendars, events, feeds and subscriptions. Authenticate every request with a cs_live_* key.
Authentication
curl
curl https://calsync.cc/api/v1/me \
-H "Authorization: Bearer cs_live_YOUR_KEY_HERE"Create keys in API Keys (sign-in required). Keys are hashed at rest; the full secret is shown exactly once. Personal keys bill against your free plan, org-scoped keys against the organization's plan.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/me | Authenticated caller, plan and usage |
| GET | /api/v1/calendars | List accessible calendars |
| POST | /api/v1/calendars | Create a calendar (personal key) |
| GET | /api/v1/calendars/:id | Get a calendar |
| PATCH | /api/v1/calendars/:id | Update a calendar |
| DELETE | /api/v1/calendars/:id | Delete a calendar and events |
| GET | /api/v1/events?calendarId= | List events on a calendar |
| POST | /api/v1/events | Create an event |
| GET | /api/v1/events/:id | Get an event |
| PATCH | /api/v1/events/:id | Update an event |
| DELETE | /api/v1/events/:id | Delete an event |
| GET | /api/v1/feeds/:slug | Feed info + ICS URL for a calendar |
| GET | /api/v1/subscriptions | Subscriber counts |
Example: create a calendar
Node.js / fetch
const res = await fetch("https://calsync.cc/api/v1/calendars", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer cs_live_YOUR_KEY_HERE",
},
body: JSON.stringify({ title: "Tour dates", slug: "tour-2026" }),
});
const { calendar } = await res.json(); // 201 CreatedErrors & limits
401
UNAUTHORIZED
Missing or invalid API key
403
ORGANIZATION_INACTIVE
The org that owns the key is past due
403
SCOPE_FORBIDDEN
The key lacks the required scope
402
PLAN_LIMIT_REACHED
Monthly included requests exhausted (Free / soft cap)
429
RATE_LIMIT
Too many requests — check Retry-After
Successful responses include X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Plan headers so you can monitor usage programmatically.