API reference

Calendar feeds

5 endpoints, served at https://orbitwrite.com/api/v1. Each one lists the credentials it accepts, its parameters and every response it can give.

List calendar feeds#

GET/api/v1/calendar-feeds

The caller's own feeds (with their tokens), plus — for anyone holding calendarFeed:manageAny (owner/admin) — a token-less roster of every feed in the workspace so they can see who created what and revoke if needed.

Authentication

A signed-in session only. The Orbitwrite app calls this; an API key is refused.

Query parameters

organizationIdstringRequired

At least 1 character.

Responses

200CalendarFeedList

The caller's feeds and (for managers) the workspace roster

Response attributes
subscriptionsCalendarFeed[]Required
Child attributes
idstringRequired
namestring | nullRequired
tokenstringRequired

The feed's URL secret — only ever returned to its owner

statusesstring[]Required
lastAccessedAtstring | nullRequired

ISO 8601.

createdAtstringRequired

ISO 8601.

canManageAllbooleanRequired

Whether the caller holds calendarFeed:manageAny — i.e. may see the roster below and revoke a teammate's feed

allSubscriptionsWorkspaceCalendarFeed[]Required

Roster of every feed in the workspace (token-less); empty unless canManageAll

Child attributes
idstringRequired
namestring | nullRequired
statusesstring[]Required
lastAccessedAtstring | nullRequired

ISO 8601.

createdAtstringRequired

ISO 8601.

ownerIdstringRequired
ownerNamestring | nullRequired
ownerEmailstringRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/calendar-feeds
curl -X GET "https://orbitwrite.com/api/v1/calendar-feeds?organizationId=organizationId" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "subscriptions": [
    {
      "id": "string",
      "name": "string",
      "token": "string",
      "statuses": [
        "string"
      ],
      "lastAccessedAt": "string",
      "createdAt": "string"
    }
  ],
  "canManageAll": true,
  "allSubscriptions": [
    {
      "id": "string",
      "name": "string",
      "statuses": [
        "string"
      ],
      "lastAccessedAt": "string",
      "createdAt": "string",
      "ownerId": "string",
      "ownerName": "string",
      "ownerEmail": "string"
    }
  ]
}

Create a calendar feed#

POST/api/v1/calendar-feeds

Any member can create feeds for themselves. The response includes the feed's token (its URL secret).

Authentication

A signed-in session only. The Orbitwrite app calls this; an API key is refused.

Body application/json

organizationIdstringRequired

At least 1 character.

namestring

At most 100 characters. Defaults to "".

statusesstring[]

Statuses the feed surfaces. An unknown status is rejected rather than dropped; an empty list means the default view (scheduled + published).

Defaults to [].

  • "scheduled"
  • "planned"
  • "published"
  • "draft"
  • "pending_approval"
  • "failed"

Responses

200CalendarFeedMutationResult

The feed was created

Response attributes
okbooleanRequired
subscriptionCalendarFeedRequired
Child attributes
idstringRequired
namestring | nullRequired
tokenstringRequired

The feed's URL secret — only ever returned to its owner

statusesstring[]Required
lastAccessedAtstring | nullRequired

ISO 8601.

createdAtstringRequired

ISO 8601.

400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
POST /api/v1/calendar-feeds
curl -X POST "https://orbitwrite.com/api/v1/calendar-feeds" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string"
}'
Response
{
  "ok": true,
  "subscription": {
    "id": "string",
    "name": "string",
    "token": "string",
    "statuses": [
      "string"
    ],
    "lastAccessedAt": "string",
    "createdAt": "string"
  }
}

Update one of your calendar feeds#

PATCH/api/v1/calendar-feeds/{feedId}

Partial update scoped to the caller's own feeds — an omitted field is left unchanged. Deliberately not widened by calendarFeed:manageAny: revoking a teammate's feed is a security action, rewriting their private calendar view is not.

Authentication

A signed-in session only. The Orbitwrite app calls this; an API key is refused.

Path parameters

feedIdstringRequired

At least 1 character.

Body application/json

organizationIdstringRequired

At least 1 character.

namestring

The feed's label. Omit to leave it unchanged; send "" to clear it.

At most 100 characters.

statusesstring[]

Statuses the feed surfaces. Omit to leave the current filter unchanged; an empty list means the default view (scheduled + published). An unknown status is rejected rather than dropped.

  • "scheduled"
  • "planned"
  • "published"
  • "draft"
  • "pending_approval"
  • "failed"

Responses

200CalendarFeedMutationResult

The updated feed

Response attributes
okbooleanRequired
subscriptionCalendarFeedRequired
Child attributes
idstringRequired
namestring | nullRequired
tokenstringRequired

The feed's URL secret — only ever returned to its owner

statusesstring[]Required
lastAccessedAtstring | nullRequired

ISO 8601.

createdAtstringRequired

ISO 8601.

400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
PATCH /api/v1/calendar-feeds/{feedId}
curl -X PATCH "https://orbitwrite.com/api/v1/calendar-feeds/{feedId}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string"
}'
Response
{
  "ok": true,
  "subscription": {
    "id": "string",
    "name": "string",
    "token": "string",
    "statuses": [
      "string"
    ],
    "lastAccessedAt": "string",
    "createdAt": "string"
  }
}

Revoke a calendar feed#

DELETE/api/v1/calendar-feeds/{feedId}

Members revoke their own feeds; anyone holding calendarFeed:manageAny (owner/admin) can revoke any feed in the workspace. After this the token 404s.

Authentication

A signed-in session only. The Orbitwrite app calls this; an API key is refused.

Path parameters

feedIdstringRequired

At least 1 character.

Query parameters

organizationIdstringRequired

At least 1 character.

Responses

200CalendarFeedDeleteResult

The mutation was applied

Response attributes
okbooleanRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
DELETE /api/v1/calendar-feeds/{feedId}
curl -X DELETE "https://orbitwrite.com/api/v1/calendar-feeds/{feedId}?organizationId=organizationId" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "ok": true
}

Public iCal feed#

GET/api/v1/calendar/{token}

The iCalendar (.ics) feed behind a calendar-feed subscription. The token is the only credential — no session or API key — so calendar clients can poll it anonymously. A .ics suffix on the token is accepted and ignored.

Authentication

None. This endpoint is public.

Path parameters

tokenstringRequired

At least 1 character.

Responses

200string

The feed's events as an iCalendar document

404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/calendar/{token}
curl -X GET "https://orbitwrite.com/api/v1/calendar/{token}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
"string"