Topolo Docs Topolo Platform
Open workspace

Reschedule booking — Calendar

Move a booking to a specific new time.

Move a booking to a specific new time.

Action: app_topolo_calendar.bookings.reschedule · POST /api/admin/bookings/{bookingId}/reschedule

Declared permission: app_topolo_calendar.bookings:write. For authorized Calendar users; permissions and resource access still apply.

Before you start

  • Use the current credential to confirm the production organization and inspect this exact action before preparing a call.
  • Declared permission: app_topolo_calendar.bookings:write. Permission discovery is not a grant.
  • Discover the authorized Calendar workspace and pass it as resourceType=workspace/resourceId separately from this action input. Calendar records and IDs are scoped to the selected host/workspace.
  • Validate and plan the exact payload, obtain effect-specific authorization, then execute unchanged only in a separately authorized operational task. Do not run these synthetic inputs.

Inputs and field meanings

FieldPresenceDeclared constraintMeaning
bookingIdrequiredstringBooking ID discovered through bookings.list/get for this host; never a public manage token.
startAtoptionalstringOffset-aware ISO8601 instant. The source stores normalized UTC; retain the intended host/invitee timezone interpretation.
endAtoptionalstringOffset-aware end instant after start. Create derives end from duration/type; update/reschedule can use this explicit end.
durationMinutesoptionalinteger; minimum=5; maximum=480Integer 5–480. Required for a custom creation without an event type; otherwise the type/current duration supplies a default.
inviteeNameoptionalstringIntended invitee display name. Creation requires nonempty text; confirm the person before any communication.
inviteeEmailoptionalnullable/unionIntended recipient. Creation can fall back to the host email when omitted/blank; updates preserve the old address for blank/null values. Do not rely on fallback for real invitations.
inviteeTimezoneoptionalnullable/unionInvitee timezone label. Creation defaults to the host timezone; update null/omission preserves the previous value.
inviteeNotesoptionalnullable/unionInvitee notes. Creation defaults to null; update null/omission preserves prior notes and an explicit empty string can clear them.

Worked request and response

Source-reviewed illustration only. Nothing below was executed; all identifiers, counts, states, credentials and URLs are synthetic. Replace identifiers through discovery before any separately authorized call.

Resource context: workspace; it is not an extra action input field.

Illustrative action input:

{
  "bookingId": "bkg_example",
  "startAt": "2026-11-23T11:00:00+04:00",
  "endAt": "2026-11-23T11:30:00+04:00"
}

Illustrative HTTP 200 source response:

{
  "booking": {
    "id": "bkg_example",
    "hostId": "hst_example",
    "eventTypeId": "evt_example",
    "calendarUid": "bkg_example@calendar.topolo.app",
    "sequence": 1,
    "startAt": "2026-11-23T07:00:00.000Z",
    "endAt": "2026-11-23T07:30:00.000Z",
    "status": "confirmed",
    "inviteeName": "Example Invitee",
    "inviteeEmail": "invitee@example.com",
    "inviteeTimezone": "Asia/Dubai",
    "inviteeNotes": null,
    "meetingProvider": null,
    "meetingProviderRef": null,
    "createdAt": "2026-11-01T00:00:00.000Z",
    "updatedAt": "2026-11-01T00:00:00.000Z",
    "cancelledAt": null,
    "cancellationReason": null,
    "recurrenceSeriesId": null,
    "recurrenceInstanceStart": null,
    "attendees": [
      {
        "id": "att_example",
        "bookingId": "bkg_example",
        "email": "invitee@example.com",
        "name": "Example Invitee",
        "role": "invitee",
        "responseStatus": "needs_action",
        "createdAt": "2026-11-01T00:00:00.000Z",
        "updatedAt": null
      }
    ]
  }
}

The returned UTC window is 11:00–11:30 Asia/Dubai. Confirm both ends. Supplying bookingId alone is schema-valid but is not a useful reschedule and can still request a modified invitation. This illustration starts from sequence 0 and returns sequence 1 after the source update; attendees describes the stored invitee row.

The illustrative response passes the declared structural schema. This establishes only schema compatibility, not deployed shape, values, authorization or business outcome.

Effects and verification

  • Updates the booking window after a conflict check and requests an updated invitation.
  • A recurring instance is recorded as an exception.
  1. Read bookings.get/list and confirm the new window plus related receipt state.

Refusals and recovery

Selected source refusals are listed below; runtime middleware can return additional structured errors.

HTTPErrorSupported response
403forbiddenReconcile the declared permission, organization and verified resource grant with the legitimate access owner; do not switch context to bypass a refusal.
404no_hostRead host.get; if it returns host:null, create the intended workspace host through host.update before retrying.
404not_foundList records in the selected workspace and discover the identifier again. Do not probe another workspace by guessing IDs.
409booking_conflictChoose another time after checking bookings and busy time. Reconcile a previous uncertain create before trying again.
400invalid_time_windowCorrect start/end ordering and confirm the intended timezone.

Recovery: Restore the original window only if it remains available and the owner authorizes another update message. Earlier messages and observed effects remain history.

After an uncertain mutation, reconcile the named records and provider/delivery evidence before repeating it.

  • app_topolo_calendar.bookings.get: Read a booking and its related event type and delivery receipts.
  • app_topolo_calendar.bookings.list: Find bookings within an explicit time window.
  • app_topolo_calendar.bookings.update: Edit a booking’s time or invitee details.

Declared schemas and provenance

The hidden action guide carries these exact current declared schemas. They are not rewritten to make the illustrations pass.

Input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "bookingId": {
      "type": "string",
      "minLength": 1
    },
    "startAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "endAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "durationMinutes": {
      "type": "integer",
      "minimum": 5,
      "maximum": 480
    },
    "inviteeName": {
      "type": "string"
    },
    "inviteeEmail": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "inviteeTimezone": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "inviteeNotes": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "bookingId"
  ],
  "additionalProperties": false
}

Output schema:

{
  "type": "object",
  "title": "Reschedule booking response",
  "description": "Operation result returned by bookings.reschedule.",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "id": {
      "type": "string"
    },
    "data": {
      "oneOf": [
        {
          "type": "object",
          "title": "booking record",
          "properties": {
            "id": {
              "type": "string",
              "description": "Stable identifier when the booking exposes one."
            }
          },
          "additionalProperties": true
        },
        {
          "type": "object",
          "additionalProperties": true
        }
      ]
    },
    "result": {
      "type": "object",
      "additionalProperties": true
    },
    "message": {
      "type": "string"
    }
  },
  "additionalProperties": true,
  "x-topolo-contract-source": "derived-action-metadata",
  "x-topolo-contract-precision": "structural"
}

Source: TopoloCalendar@b378ceb73800ee1d1e6c4ff6f0b4179918cf632c, apps/api/src/routes/admin-bookings.ts. Current catalog metadata and source were compared without executing the application.

  • Source-reviewed synthetic input/response; not captured or executed.
  • Source revision is not proof of current deployment, caller access, provider connection or notification delivery.
  • The illustrative response passes the declared structural schema. This establishes only schema compatibility, not deployed shape, values, authorization or business outcome.
  • The reviewed persistence UPDATE targets pending/confirmed rows only. Other statuses can return the unchanged record; require an editable state and compare actual fields rather than treating HTTP 200 as proof the change landed.