Topolo Docs Topolo Platform
Open workspace

Create event type — Calendar

Create an active event type with an explicit booking address and timing rules.

Create an active event type with an explicit booking address and timing rules.

Action: app_topolo_calendar.event_types.create · POST /api/admin/event-types

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

FieldPresenceDeclared constraintMeaning
slugrequiredstringPublic event-type URL segment; the source normalizes it. Changing it changes links already shared.
namerequiredstringHuman event-type name; nonempty after trimming.
descriptionoptionalnullable/unionOptional event-type description; read the actual saved value after mutation.
durationMinutesrequiredinteger; minimum=5; maximum=480Integer 5–480. Required for a custom creation without an event type; otherwise the type/current duration supplies a default.
bufferBeforeMinutesoptionalinteger; minimum=0; maximum=1440Integer 0–1440 of padding before a slot; affects future offered slots.
bufferAfterMinutesoptionalinteger; minimum=0; maximum=1440Integer 0–1440 of padding after a slot; affects future offered slots.
minNoticeMinutesoptionalinteger; minimum=0; maximum=525600Integer 0–525600 minimum notice before an offered booking starts.
maxAdvanceDaysoptionalinteger; minimum=1; maximum=365Integer 1–365 maximum advance window for offered bookings.
slotIncrementMinutesoptionalinteger; minimum=5; maximum=240Integer 5–240 between candidate slot starts; distinct from event duration.
locationKindoptionalstring; 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.
locationDetailoptionalnullable/unionOptional location/link/instruction text; confirm intended disclosure to invitees.

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:

{
  "slug": "intro-call",
  "name": "Intro call",
  "durationMinutes": 30,
  "bufferAfterMinutes": 10,
  "minNoticeMinutes": 120,
  "locationKind": "phone",
  "locationDetail": "Use the agreed phone number."
}

Illustrative HTTP 201 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": false
  }
}

eventType.id is the new record. This example is the first type (displayOrder 0), uses a phone location, and defaults to approvalRequired:false. The public path includes the actual host.handle followed by the returned slug.

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

Effects and verification

  • Creates an active event type; the slug contributes to its public booking URL.
  • Duration, buffers, notice, advance range and slot increment affect future offered slots.
  1. Read event_types.get/list and match slug, duration, timing constraints and location before sharing.

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.
409slug_takenDiscover the existing type; choose a distinct slug only if a new type is intended.
400invalid_durationUse an integer duration from 5 through 480 minutes.

Recovery: Delete only the newly created type after discovering its ID and checking it has no booking references. Deletion is refused once in use.

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

  • app_topolo_calendar.host.get: Read the selected workspace host, including the unconfigured host:null state.
  • app_topolo_calendar.event_types.list: Discover active event types and their IDs.
  • app_topolo_calendar.event_types.get: Read one known event type, including an inactive one.
  • app_topolo_calendar.event_types.delete: Delete an event type only when no bookings reference it.

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": {
    "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"
        }
      ]
    }
  },
  "required": [
    "slug",
    "name",
    "durationMinutes"
  ],
  "additionalProperties": false
}

Output schema:

{
  "type": "object",
  "title": "Create event type response",
  "description": "Operation result returned by event_types.create.",
  "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.
  • approvalRequired is not in the published create input schema even though the reviewed route reads it. Use the declared action fields; event_types.update exposes the flag.