Update a known event type without losing its identity.
Action: app_topolo_calendar.event_types.update · PUT /api/admin/event-types/{eventTypeId}
Declared permission: app_topolo_calendar.event_types: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.event_types: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
| Field | Presence | Declared constraint | Meaning |
|---|---|---|---|
eventTypeId | required | string | Type ID discovered with event_types.list/get. Creation uses either this or eventTypeSlug, never both. |
slug | optional | string | Public event-type URL segment; the source normalizes it. Changing it changes links already shared. |
name | optional | string | Human event-type name; nonempty after trimming. |
description | optional | nullable/union | Optional event-type description; read the actual saved value after mutation. |
durationMinutes | optional | integer; minimum=5; maximum=480 | Integer 5–480. Required for a custom creation without an event type; otherwise the type/current duration supplies a default. |
bufferBeforeMinutes | optional | integer; minimum=0; maximum=1440 | Integer 0–1440 of padding before a slot; affects future offered slots. |
bufferAfterMinutes | optional | integer; minimum=0; maximum=1440 | Integer 0–1440 of padding after a slot; affects future offered slots. |
minNoticeMinutes | optional | integer; minimum=0; maximum=525600 | Integer 0–525600 minimum notice before an offered booking starts. |
maxAdvanceDays | optional | integer; minimum=1; maximum=365 | Integer 1–365 maximum advance window for offered bookings. |
slotIncrementMinutes | optional | integer; minimum=5; maximum=240 | Integer 5–240 between candidate slot starts; distinct from event duration. |
locationKind | optional | string; enum=["chat_meeting", "microsoft_teams", "google_meet", "zoom", "in_person", "phone", "custom"] | One declared meeting/location type. Provider meeting work depends on this choice; do not invent connected provider adapters. |
locationDetail | optional | nullable/union | Optional location/link/instruction text; confirm intended disclosure to invitees. |
displayOrder | optional | integer; minimum=0; maximum=1000000 | Integer 0–1000000 used for event-type ordering. |
isActive | optional | boolean | Whether the event type is active for ordinary listing/public use; changing it does not delete history. |
approvalRequired | optional | boolean | Whether new bookings require approval. Available on update; not declared on create. |
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:
{
"eventTypeId": "evt_example",
"approvalRequired": true
}
Illustrative HTTP 200 source response:
{
"eventType": {
"id": "evt_example",
"hostId": "hst_example",
"slug": "intro-call",
"name": "Intro call",
"description": null,
"durationMinutes": 30,
"bufferBeforeMinutes": 0,
"bufferAfterMinutes": 10,
"minNoticeMinutes": 120,
"maxAdvanceDays": 60,
"slotIncrementMinutes": 15,
"locationKind": "phone",
"locationDetail": "Use the agreed phone number.",
"displayOrder": 0,
"isActive": true,
"approvalRequired": true
}
}
Only approvalRequired changes in this illustration. Future bookings can become pending; existing bookings keep their stored times. A slug change changes shared URLs and must be deliberate.
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 supplied fields on the host’s type.
- Changing slug, active state or timing can affect future booking access; it does not retroactively move bookings.
- Read event_types.get and verify every intended field and retained fields, especially slug/active/approval state.
Refusals and recovery
Selected source refusals are listed below; runtime middleware can return additional structured errors.
| HTTP | Error | Supported response |
|---|---|---|
| 403 | forbidden | Reconcile the declared permission, organization and verified resource grant with the legitimate access owner; do not switch context to bypass a refusal. |
| 404 | no_host | Read host.get; if it returns host:null, create the intended workspace host through host.update before retrying. |
| 404 | not_found | List records in the selected workspace and discover the identifier again. Do not probe another workspace by guessing IDs. |
| 409 | slug_taken | Choose an unused slug for this host or preserve the existing one. |
Recovery: Restore a full prior editable snapshot after checking current bookings and shared links; effects observed while changed cannot be recalled.
After an uncertain mutation, reconcile the named records and provider/delivery evidence before repeating it.
Related actions
app_topolo_calendar.event_types.get: Read one known event type, including an inactive one.app_topolo_calendar.event_types.list: Discover active event types and their IDs.app_topolo_calendar.bookings.list: Find bookings within an explicit time window.
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": {
"eventTypeId": {
"type": "string",
"minLength": 1
},
"slug": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"durationMinutes": {
"type": "integer",
"minimum": 5,
"maximum": 480
},
"bufferBeforeMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"bufferAfterMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"minNoticeMinutes": {
"type": "integer",
"minimum": 0,
"maximum": 525600
},
"maxAdvanceDays": {
"type": "integer",
"minimum": 1,
"maximum": 365
},
"slotIncrementMinutes": {
"type": "integer",
"minimum": 5,
"maximum": 240
},
"locationKind": {
"type": "string",
"enum": [
"chat_meeting",
"microsoft_teams",
"google_meet",
"zoom",
"in_person",
"phone",
"custom"
]
},
"locationDetail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"displayOrder": {
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"isActive": {
"type": "boolean"
},
"approvalRequired": {
"type": "boolean"
}
},
"required": [
"eventTypeId"
],
"additionalProperties": false
}
Output schema:
{
"type": "object",
"title": "Update event type response",
"description": "Operation result returned by event_types.update.",
"properties": {
"success": {
"type": "boolean"
},
"id": {
"type": "string"
},
"data": {
"oneOf": [
{
"type": "object",
"title": "event record",
"properties": {
"id": {
"type": "string",
"description": "Stable identifier when the event 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-event-types.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.