Skip to main content
Glama

create_booking

Destructive

Create a real event booking on an existing event, without collecting card payment.

This writes live data and has customer-visible side effects - it is not a dry run or a preview. Tickets are issued, a confirmation email with the ticket PDF is sent to the customer, live-mode bookings decrement the ticket type's remaining capacity (test-mode bookings do not), the booking.paid webhook fires, and an invoice may be generated. There is no undo through this API: cancellations, refunds and ticket transfers must be done in the Checkout Page dashboard. Confirm the event, the ticket quantities and the customer's email with the merchant before calling it.

Not idempotent - never retry blindly. Every call creates a new booking, so calling again after a timeout or an unclear error can issue duplicate tickets and send a second confirmation email. If the outcome of a call is uncertain, check list_bookings (search by the customer's email) before trying again.

No card payment is collected. There are two booking strategies, and exactly one of them must be supplied:

  • paymentOption.manualType records the booking as unpaid with the full amount as its balance due, settled outside checkout by invoice (invoice) or on arrival (cash_on_delivery); a free booking simply has nothing due. Use it for box-office and phone bookings, invoiced corporate registrations, and migrating bookings in.

  • complimentary: true records the booking as paid with amount, amountPaid and amountDue of 0 and isComplimentary: true. The ticket lines keep their face value and a matching complimentaryDiscountAmount brings the total to 0, so the forgone revenue stays visible on the booking and its invoice. Use it for comped guests, speakers, staff and press. No coupon can be applied.

Neither strategy takes a card payment: that belongs on the event's own checkout.

The storefront guards still apply, exactly as they would for a buyer checking out:

  • 409 — the ticket type or its ticket group is sold out, or the requested quantity exceeds remaining capacity.

  • 409 - tickets are not on sale: the sale window has not opened or has closed, or the ticket type or its ticket group is disabled. A disabled ticket cannot be booked by any strategy, complimentary included.

  • 403 — the event's registration limit has been reached.

  • 400 — a required field is missing, a required address sub-field is missing, or the email value is not a valid address.

  • 400 — the seller account is not connected to Stripe.

  • 429 - the store has reached its daily limit on added bookings.

  • 400 - both paymentOption and complimentary: true were supplied, or neither was. Exactly one is required.

  • 400 - a couponId was supplied on a complimentary booking. A comp is already at zero, so no coupon can be applied.

Example uses:

  • "Comp two VIP tickets for jane@example.com on the Summer Gala" → complimentary: true

  • "Register Acme Corp for 10 standard tickets to the conference and invoice them" → paymentOption: { manualType: 'invoice' }

  • "Add a walk-in booking for the Tuesday workshop, paying cash on arrival" → paymentOption: { manualType: 'cash_on_delivery' }

Input Schema

NameRequiredDescriptionDefault
fieldsYesValues for the event's fields. Must include a value for the event's email field - the booking's customer is created from it.
eventIdYesThe ID of the event to book onto.
ticketsYesTicket types to book, keyed by ticket type ID with the quantity as the value. Use the event to discover ticket type IDs. A disabled ticket type, or one in a disabled ticket group, cannot be booked.
couponIdNoA coupon to apply to the booking.
complimentaryNoIssue the tickets at no charge. The booking is recorded as `paid` with `amount`, `amountPaid` and `amountDue` of 0, `isComplimentary: true`, and the ticket lines at their face value with a matching complimentary discount. Mutually exclusive with `paymentOption` and `couponId`.
paymentOptionNoHow a manually settled booking is paid for. This endpoint never collects card payment: the booking is recorded as unpaid with the amount as its balance due - for a free booking that balance is zero. Settlement happens outside checkout. Omit it and pass `complimentary: true` instead to issue the tickets at no charge.
queryParametersNoAttribution or tracking parameters to record against the booking, mirroring the query string a storefront checkout captures from its page link. Stored on the booking and included in exports; not used in pricing.
ticketPwywAmountsNoChosen amounts for pay-what-you-want ticket types, keyed by ticket type ID, in the smallest currency unit. Required for any pay-what-you-want ticket type included in `tickets`.

Output Schema

NameRequiredDescriptionDefault
dataYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • removedInput schema / properties / attendees
      Removed value: -{
      -  "description": "Attendees for an event that collects attendee details, at most one per ticket. Each attendee names its ticket type and takes the next ticket of that type, so the order of the list doesn't matter. Tickets without an attendee are left blank, and the booking then waits for them. An attendee with answers must have a `name` or an `email`. Answer the event's `attendeeQuestions` by `id` in `answers`; the name and email address go in `name` and `email`. Ignored for events that don't collect attendee details.",
      -  "items": {
      -    "additionalProperties": false,
      -    "properties": {
      -      "answers": {
      -        "items": {
      -          "properties": {
      -            "fieldId": {
      -              "description": "ID of one of the event's `attendeeQuestions`. Any other ID, including the event's Name and Email address questions, is refused with a 400.",
      -              "type": "string"
      -            },
      -            "value": {
      -              "maxLength": 5000,
      -              "type": "string"
      -            },
      -            "values": {
      -              "items": {
      -                "maxLength": 1000,
      -                "type": "string"
      -              },
      -              "maxItems": 100,
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "fieldId"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "type": "array"
      -      },
      -      "email": {
      -        "maxLength": 320,
      -        "type": "string"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "type": "string"
      -      },
      -      "ticketTypeId": {
      -        "description": "ID of the ticket type this attendee holds. Must be one of the ticket types in `tickets`.",
      -        "pattern": "^[0-9a-fA-F]{24}$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "ticketTypeId"
      -    ],
      -    "type": "object"
      -  },
      -  "maxItems": 1000,
      -  "type": "array"
      -}
    • removedOutput schema / properties / data / properties / attendeeStatus
      Removed value: -{
      -  "description": "Attendee details: `complete` (every ticket has an attendee), `missing` (some tickets don't yet), `flagged` (one or more attendees flagged for the seller to review) or `optional` (the customer isn't asked, so the seller adds attendees if they want to). Absent while a booking has no attendee details to track.",
      -  "enum": [
      -    "complete",
      -    "missing",
      -    "flagged",
      -    "optional"
      -  ],
      -  "type": "string"
      -}
    • removedOutput schema / properties / data / properties / attendees
      Removed value: -{
      -  "description": "The attendees added so far, one per ticket, on events that collect attendee details. A ticket without an attendee has no entry.",
      -  "items": {
      -    "additionalProperties": false,
      -    "properties": {
      -      "answers": {
      -        "description": "The attendee's answers to the event's attendee questions, in the same shape as the booking's `fields`. `reference` matches the question's reference. Name and email are not repeated here.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "element": {
      -              "anyOf": [
      -                {
      -                  "enum": [
      -                    "checkbox",
      -                    "quantity",
      -                    "multiple-choice",
      -                    "select",
      -                    "multi-select",
      -                    "po-number",
      -                    "text",
      -                    "textarea",
      -                    "number",
      -                    "date-time",
      -                    "date",
      -                    "time",
      -                    "address",
      -                    "email",
      -                    "tax-id",
      -                    "phone",
      -                    "country"
      -                  ],
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "fieldId": {
      -              "description": "Unique field ID.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "label": {
      -              "description": "Label shown for the field.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "meta": {
      -              "anyOf": [
      -                {
      -                  "additionalProperties": {},
      -                  "propertyNames": {
      -                    "type": "string"
      -                  },
      -                  "type": "object"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "reference": {
      -              "description": "Reference key for the field.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "type": {
      -              "anyOf": [
      -                {
      -                  "enum": [
      -                    "",
      -                    "company-name",
      -                    "po-number",
      -                    "name",
      -                    "first-name",
      -                    "last-name",
      -                    "email",
      -                    "billing-email",
      -                    "phone",
      -                    "address-line1",
      -                    "address-city",
      -                    "address-country",
      -                    "address-line2",
      -                    "address-postal_code",
      -                    "address-state",
      -                    "shipping-name",
      -                    "shipping-phone",
      -                    "shipping-address-line1",
      -                    "shipping-address-city",
      -                    "shipping-address-country",
      -                    "shipping-address-line2",
      -                    "shipping-address-postal_code",
      -                    "shipping-address-state",
      -                    "tax-id"
      -                  ],
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "value": {
      -              "description": "Submitted value for the field.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "values": {
      -              "anyOf": [
      -                {
      -                  "items": {
      -                    "type": "string"
      -                  },
      -                  "type": "array"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "description": "Chosen option values of a multi-select field (an option without a value is named by its label), in the order the options are defined. `value` holds the same values joined with \", \". The matching labels, as they were when the answer was written, are in `meta.selectedOptionLabels` and joined in `meta.selectedOptionLabel`. Absent on every other field type."
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "email": {
      -        "description": "The attendee's email address.",
      -        "type": "string"
      -      },
      -      "flagged": {
      -        "description": "True when the event's email domain rule flagged this attendee for the seller to review. It stays true after review; see `reviewedAt`.",
      -        "type": "boolean"
      -      },
      -      "name": {
      -        "description": "The attendee's name.",
      -        "type": "string"
      -      },
      -      "position": {
      -        "description": "Attendee number, 1 for the first ticket, in the order the event lists its ticket types.",
      -        "type": "number"
      -      },
      -      "reviewedAt": {
      -        "description": "ISO-8601 UTC timestamp the seller marked this flagged attendee as reviewed. The booking counts as `flagged` while any flagged attendee has none.",
      -        "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))$",
      -        "type": "string"
      -      },
      -      "ticketId": {
      -        "description": "ID of the attendee's ticket. Absent until the booking's tickets are created, which happens once it's paid or confirmed.",
      -        "type": "string"
      -      },
      -      "ticketTypeId": {
      -        "description": "ID of the ticket type this attendee holds.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "position",
      -      "ticketTypeId"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
  2. Changed3 schema fields changed
    • addedInput schema / properties / attendees
      Added value: +{
      +  "description": "Attendees for an event that collects attendee details, at most one per ticket. Each attendee names its ticket type and takes the next ticket of that type, so the order of the list doesn't matter. Tickets without an attendee are left blank, and the booking then waits for them. An attendee with answers must have a `name` or an `email`. Answer the event's `attendeeQuestions` by `id` in `answers`; the name and email address go in `name` and `email`. Ignored for events that don't collect attendee details.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "answers": {
      +        "items": {
      +          "properties": {
      +            "fieldId": {
      +              "description": "ID of one of the event's `attendeeQuestions`. Any other ID, including the event's Name and Email address questions, is refused with a 400.",
      +              "type": "string"
      +            },
      +            "value": {
      +              "maxLength": 5000,
      +              "type": "string"
      +            },
      +            "values": {
      +              "items": {
      +                "maxLength": 1000,
      +                "type": "string"
      +              },
      +              "maxItems": 100,
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "fieldId"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "type": "array"
      +      },
      +      "email": {
      +        "maxLength": 320,
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "type": "string"
      +      },
      +      "ticketTypeId": {
      +        "description": "ID of the ticket type this attendee holds. Must be one of the ticket types in `tickets`.",
      +        "pattern": "^[0-9a-fA-F]{24}$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "ticketTypeId"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 1000,
      +  "type": "array"
      +}
    • addedOutput schema / properties / data / properties / attendeeStatus
      Added value: +{
      +  "description": "Attendee details: `complete` (every ticket has an attendee), `missing` (some tickets don't yet), `flagged` (one or more attendees flagged for the seller to review) or `optional` (the customer isn't asked, so the seller adds attendees if they want to). Absent while a booking has no attendee details to track.",
      +  "enum": [
      +    "complete",
      +    "missing",
      +    "flagged",
      +    "optional"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / data / properties / attendees
      Added value: +{
      +  "description": "The attendees added so far, one per ticket, on events that collect attendee details. A ticket without an attendee has no entry.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "answers": {
      +        "description": "The attendee's answers to the event's attendee questions, in the same shape as the booking's `fields`. `reference` matches the question's reference. Name and email are not repeated here.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "element": {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "checkbox",
      +                    "quantity",
      +                    "multiple-choice",
      +                    "select",
      +                    "multi-select",
      +                    "po-number",
      +                    "text",
      +                    "textarea",
      +                    "number",
      +                    "date-time",
      +                    "date",
      +                    "time",
      +                    "address",
      +                    "email",
      +                    "tax-id",
      +                    "phone",
      +                    "country"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "fieldId": {
      +              "description": "Unique field ID.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "label": {
      +              "description": "Label shown for the field.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "meta": {
      +              "anyOf": [
      +                {
      +                  "additionalProperties": {},
      +                  "propertyNames": {
      +                    "type": "string"
      +                  },
      +                  "type": "object"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "reference": {
      +              "description": "Reference key for the field.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "type": {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "",
      +                    "company-name",
      +                    "po-number",
      +                    "name",
      +                    "first-name",
      +                    "last-name",
      +                    "email",
      +                    "billing-email",
      +                    "phone",
      +                    "address-line1",
      +                    "address-city",
      +                    "address-country",
      +                    "address-line2",
      +                    "address-postal_code",
      +                    "address-state",
      +                    "shipping-name",
      +                    "shipping-phone",
      +                    "shipping-address-line1",
      +                    "shipping-address-city",
      +                    "shipping-address-country",
      +                    "shipping-address-line2",
      +                    "shipping-address-postal_code",
      +                    "shipping-address-state",
      +                    "tax-id"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "value": {
      +              "description": "Submitted value for the field.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "values": {
      +              "anyOf": [
      +                {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "Chosen option values of a multi-select field (an option without a value is named by its label), in the order the options are defined. `value` holds the same values joined with \", \". The matching labels, as they were when the answer was written, are in `meta.selectedOptionLabels` and joined in `meta.selectedOptionLabel`. Absent on every other field type."
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "email": {
      +        "description": "The attendee's email address.",
      +        "type": "string"
      +      },
      +      "flagged": {
      +        "description": "True when the event's email domain rule flagged this attendee for the seller to review. It stays true after review; see `reviewedAt`.",
      +        "type": "boolean"
      +      },
      +      "name": {
      +        "description": "The attendee's name.",
      +        "type": "string"
      +      },
      +      "position": {
      +        "description": "Attendee number, 1 for the first ticket, in the order the event lists its ticket types.",
      +        "type": "number"
      +      },
      +      "reviewedAt": {
      +        "description": "ISO-8601 UTC timestamp the seller marked this flagged attendee as reviewed. The booking counts as `flagged` while any flagged attendee has none.",
      +        "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))$",
      +        "type": "string"
      +      },
      +      "ticketId": {
      +        "description": "ID of the attendee's ticket. Absent until the booking's tickets are created, which happens once it's paid or confirmed.",
      +        "type": "string"
      +      },
      +      "ticketTypeId": {
      +        "description": "ID of the ticket type this attendee holds.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "position",
      +      "ticketTypeId"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  3. Changed2 schema fields changed
    • addedOutput schema / properties / data / properties / canceledByApiKey
      Added value: +{
      +  "description": "ID of the API key that canceled this, when it was canceled through the seller API. The key may have been deleted since; `canceledByApiKeyName` keeps its name.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / data / properties / canceledByApiKeyName
      Added value: +{
      +  "description": "Name of the API key that canceled this, as it was at the time. Kept when the key is deleted later.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / data / properties / archivedAt
      Added value: +{
      +  "anyOf": [
      +    {
      +      "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))$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "When the merchant archived this, hiding it from their default bookings list in the dashboard. Archiving changes nothing else: the payment, tickets and `orderStatus` stay as they were. Absent unless archived.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / data / properties / archivedBy
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The userId of the team member who archived this. Absent unless archived.",
      +  "type": "string"
      +}
  5. Changed2 schema fields changed
    • changedOutput schema / properties / data / properties / orderStatus / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "active",
      -      "canceled",
      -      "archived"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "active",
      +      "canceled"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / data / properties / orderStatus / description
      Previous value: -"Order lifecycle status. Valid values are active, canceled, archived."New value: +"Order lifecycle status. Valid values are active, canceled."
  6. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / paidAt
      Added value: +{
      +  "anyOf": [
      +    {
      +      "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))$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "When the payment was paid in full. For an invoice or cash payment this is when the merchant recorded the payment, which can be long after `createdAt`. Empty until fully paid, including a deposit with a balance still due."
      +}
  7. Changed1 schema field changed
    • addedOutput schema / properties / data / properties / processingFeeContribution
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amount": {
      +          "description": "Contribution in the smallest currency unit.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "fixedAmount": {
      +          "description": "The fixed part.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "name": {
      +          "description": "Name shown on the receipt, frozen at payment.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "percentage": {
      +          "description": "Percentage used for the contribution.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "percentageAmount": {
      +          "description": "The part from the percentage.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "What the customer chose to add to cover the processing fee, worked out on the total with tax. Not one of `fees`."
      +}
  8. Changed1 schema field changed
    • changedOutput schema / properties / data / properties / fees / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "amount": {
      -          "description": "Fee amount in the smallest currency unit.",
      -          "type": [
      -            "number",
      -            "null"
      -          ]
      -        },
      -        "name": {
      -          "description": "Fee name.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "percentage": {
      -          "description": "Fee percentage when applicable.",
      -          "type": [
      -            "number",
      -            "null"
      -          ]
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amount": {
      +          "description": "Fee amount in the smallest currency unit. For a fee with both a percentage and a fixed amount, the sum of `percentageAmount` and `fixedAmount`.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "fixedAmount": {
      +          "description": "The fixed part of `amount`, in the smallest currency unit, already multiplied by quantity or tickets when the fee multiplies. Only set on a fee with both a percentage and a fixed amount.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "name": {
      +          "description": "Fee name.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "percentage": {
      +          "description": "Fee percentage when applicable.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "percentageAmount": {
      +          "description": "The part of `amount` from the percentage, in the smallest currency unit. Only set on a fee with both a percentage and a fixed amount. Can be 0, e.g. when a 100% coupon leaves nothing for the percentage to apply to.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  9. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond destructiveHint=true by enumerating concrete side effects: tickets issued, confirmation email with PDF, live-mode capacity decrement, booking.paid webhook, possible invoice generation, and no undo. The explicit non-idempotency warning and the full 409/403/400/429 guard list are exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Bold headers and front-loaded warnings make it highly scannable. It is long, and some content (comp accounting, the 400 on dual strategy) is repeated between the prose and the examples, so it is dense rather than perfectly lean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, high-blast-radius mutation with 8 params and nested objects, nothing material is missing: prerequisites (Stripe connection, sale windows), conflict rules between parameters, error taxonomy, and duplicate-prevention guidance are all covered. An output schema exists, so return-value detail is correctly omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description adds real semantics: exactly one of paymentOption/complimentary must be supplied, couponId is rejected on comps, and each manualType maps to a distinct unpaid settlement flow. It also flags that `fields` must include the event's email field, which drives customer creation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a precise verb+resource+scope: 'Create a real event booking on an existing event, without collecting card payment.' It immediately distinguishes this tool from checkout-based creation ('that belongs on the event's own checkout') and from the read path (list_bookings), so an agent can route without consulting siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use each of the two mutually exclusive strategies with concrete scenarios (box-office, invoiced corporate, comped speakers/press) plus three worked examples. It also gives negative guidance: no retry on uncertainty (use list_bookings instead) and no cancellation/refund/transfer through this API (use the dashboard).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources