GET
/api/public/v1/calendar-events

List calendar events

Company calendar events with their attendees. Unlike the console grid, this returns stored records rather than expanded occurrences — a recurring event is one record carrying `recurrenceRule`, `recurrenceEndDate` and `recurrenceExclusions`, and the caller expands it. Narrow to a window with `startsAfter` and `startsBefore`.

Required scope

The access token must carry this scope. A token missing it gets 403 Forbidden. Grant them to an API client under Settings → Company → API, and to a teammate under Employee → Permissions.

calendar:read

Query Parameters

NameTypeRequiredDescription
limitnumberOptionalMaximum number of items to return (1-100).Default: 20
offsetnumberOptionalNumber of items to skip before starting to collect the result set.Default: 0
sortBystringOptionalField to sort by. Allowed values vary by endpoint.Default: createdAt
sortOrderstring
asc
desc
OptionalSort direction.Default: desc
searchstringOptionalFree-text search across the resource’s primary fields.
createdAfterstringOptionalISO 8601 timestamp — only return items created after this time.
createdBeforestringOptionalISO 8601 timestamp — only return items created before this time.
updatedAfterstringOptionalISO 8601 timestamp — only return items updated after this time.
startsAfterstringOptionalISO 8601. Only events starting at or after this instant.
startsBeforestringOptionalISO 8601. Only events starting at or before this instant.
showAsstring
DEFAULT
BUSY
FREE
OptionalFilter by how the event shows.
createdByEmployeeIdstringOptionalOnly events organized by this employee.
GETExample request
curl
curl -X GET "https://www.pxb.app/api/public/v1/calendar-events" \
  -H "Authorization: Bearer your_access_token"
200Example response
json
{
  "message": "Calendar events retrieved successfully!",
  "content": {
    "events": [
      {
        "id": "cal_5150",
        "title": "Quarterly review",
        "description": "Numbers and what we do about them.",
        "location": "Boardroom",
        "startTime": "2026-09-02T16:00:00.000Z",
        "endTime": "2026-09-02T17:00:00.000Z",
        "timezone": "America/Chicago",
        "allDay": false,
        "showAs": "DEFAULT",
        "includeVirtualMeeting": true,
        "meetingRoomId": "room_7a21",
        "recurrenceRule": null,
        "recurrenceEndDate": null,
        "recurrenceExclusions": [],
        "createdByEmployeeId": "emp_12ab",
        "attendees": [
          {
            "id": "att_01",
            "employeeId": "emp_12ab",
            "status": "ACCEPTED",
            "optional": false,
            "note": null,
            "declinedOccurrences": []
          },
          {
            "id": "att_02",
            "employeeId": null,
            "guestEmail": "advisor@example.com",
            "guestName": "Jo Advisor",
            "status": "PENDING",
            "optional": true,
            "note": null,
            "declinedOccurrences": []
          }
        ],
        "createdAt": "2026-08-14T10:00:00.000Z",
        "updatedAt": "2026-08-14T10:00:00.000Z"
      }
    ],
    "pagination": {
      "total": 42,
      "limit": 20,
      "offset": 0,
      "hasMore": true
    }
  }
}

In the console

The same thing done by hand, for anyone comparing the API against the screen they already use.

Calendar
/calendar