Checkout Page
Server Details
Create and manage checkout pages, event ticketing, forms, customers, payments and subscriptions.
- Status
- Healthy
- Uptime
- 0.7% over 59 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 58 tools
Each tool targets a distinct resource+action (pages, events, forms, products, coupons, themes, tickets, bookings, payments, subscriptions, invoices, webhooks), so boundaries are generally clear. The main risk is the six near-identical record-listing tools (list_payments, list_bookings, list_subscriptions, list_subscription_payments, list_invoices, list_submissions) for a single 'order' lookup, but the descriptions provide explicit cross-tool routing to steer selection.
Nearly all tools follow a strict verb_noun snake_case pattern (list_*, get_*, create_*, update_*, delete_*, archive_*, regenerate_*, upload_*). The few deviations (add_to_website, prepare_subscription_cancellation) still conform to verb_noun form and are semantically meaningful, not arbitrary.
58 tools is well above the typical 3-15 sweet spot, but the server covers a genuinely broad commerce platform (15+ resource types each with roughly CRUD-level operations), so the count is more defensible than a typical over-exposed surface. It remains heavy and likely overwhelms an agent's selection context.
Coverage is extensive: create/get/list/update for pages, events, forms, products, coupons, themes, tickets, submissions, customers and webhooks, plus bookings, payments, subscriptions, invoices and tax rates. Gaps are deliberate read-only deferrals (no refund, cancel, or destructive delete operations; those route to the dashboard), plus no archive/delete for pages, which agents can work around.
Available Tools
58 toolsadd_to_websiteARead-onlyInspect
Get ready-to-paste code that puts a checkout page, form, or event on a website: an inline embed, a popup button, or a plain link, as HTML and as a React component. Use it right after create_checkout_page, create_form, or create_event when the user is building or editing a website, or when the user asks to add a checkout, buy button, ticket form, or signup form to their site. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How the page shows on the website. `inline` renders it inside the page where the code is placed. `popup` opens it in an overlay when a customer clicks a button or link. `link` sends the customer to the hosted page. Omit to get all three and pick one. | |
| pageId | Yes | The ID of the checkout page, form, or event. Get it from create_checkout_page, create_form, create_event, or the list_* and get_* tools. | |
| pageType | Yes | The kind of page: `checkout` for checkout pages, `form` for forms, `event` for events. It must match the page, or the page is not found. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Ready-to-paste code that adds a Checkout Page page to a website. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false. The description repeats 'Read-only' and adds that output comes as HTML and a React component, which is useful formatting context. It does not add behavioral details beyond the annotations, such as permission requirements or error behavior, so a baseline 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: the first sentence front-loads what the tool returns, and the second provides precise usage context. Every sentence earns its place and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only code-generation tool with 100% schema coverage, full annotations, and an output schema, the description covers purpose and usage adequately. Return values are handled by the output schema, so the description does not need to explain them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters, including the mode and pageType enums, are fully documented in the schema. The description adds no additional parameter meaning or usage constraints. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get ready-to-paste code that puts a checkout page, form, or event on a website.' It explicitly distinguishes the tool from sibling creation tools by naming create_checkout_page, create_form, and create_event as preceding actions. An agent can tell this is a code-generation/embed tool, not a creator or updater.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear triggering conditions: 'Use it right after create_checkout_page, create_form, or create_event when the user is building or editing a website, or when the user asks to add a checkout, buy button, ticket form, or signup form to their site.' This covers when to use it well. However, it does not name alternatives or explicitly state when not to use it, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_ticket_typeADestructiveInspect
Archive one ticket type on an event so it is no longer on sale. It is archived, not deleted: its data and the tickets already sold are kept, and get_event still lists it with status archived. Ticket types it triggered lose that trigger. Get the event, group and ticket type IDs from get_event. Mutating.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | The ID of the event. Event IDs come from list_events, or the `id` that create_event returns. | |
| ticketTypeId | Yes | The ID of the ticket type. get_event lists each group's ticket types under `ticketGroups[].ticketTypes[].id`. | |
| ticketGroupId | Yes | The ID of the ticket group the ticket type is in, from `ticketGroups[].id` in get_event. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true, and the description meaningfully extends them: the operation is reversible-in-spirit ('archived, not deleted'), data and sold tickets are retained, get_event still lists it with status archived, and dependent ticket types lose their trigger. That is exactly the kind of consequence disclosure an agent needs before mutating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then consequences, then ID sourcing. No filler and no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-resource mutation with full schema coverage and an output schema, nothing needed to invoke it correctly is missing: what it does, what it does not do, side effects on dependent types, and where the IDs come from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already documents its source in get_event, so the schema does the heavy lifting. The description only restates the sourcing hint and adds no format or constraint detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Archive one ticket type on an event') plus the observable effect ('no longer on sale'). It is clearly distinguishable from update_ticket_type and from any delete-style sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the archive-vs-delete distinction and where to obtain the three required IDs ('Get the event, group and ticket type IDs from get_event'). It does not explicitly contrast with update_ticket_type for near-identical outcomes (e.g. simply hiding a type), so it falls short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_bookingADestructiveInspect
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.manualTyperecords the booking asunpaidwith 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: truerecords the booking aspaidwithamount,amountPaidandamountDueof 0 andisComplimentary: true. The ticket lines keep their face value and a matchingcomplimentaryDiscountAmountbrings 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
paymentOptionandcomplimentary: truewere supplied, or neither was. Exactly one is required.400 - a
couponIdwas 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' }
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Values for the event's fields. Must include a value for the event's email field - the booking's customer is created from it. | |
| eventId | Yes | The ID of the event to book onto. | |
| tickets | Yes | Ticket 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. | |
| couponId | No | A coupon to apply to the booking. | |
| complimentary | No | Issue 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`. | |
| paymentOption | No | How 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. | |
| queryParameters | No | Attribution 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. | |
| ticketPwywAmounts | No | Chosen 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
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructive/write; the description goes far beyond, disclosing the concrete side effects that make it destructive (tickets issued, PDF confirmation email sent, capacity decremented in live mode, booking.paid webhook fires, invoice may be generated), the absence of undo through this API, and the non-idempotency warning against blind retries. These are exactly the traits annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Bold front-loaded warnings and bulleted strategy/error blocks make it scannable despite being long. It is dense but almost every line earns its place; the nine-point error list is arguably more than strictly needed, slightly diluting structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A destructive, non-idempotent mutation tool with 8 params and an output schema present; the description covers side effects, no-undo path, exclusivity rules, capacity/sold-out guards with specific status codes, and worked examples. An agent has everything needed to call it safely and interpret failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantic value the schema does not: it explains the exclusivity constraint between paymentOption and complimentary, the meaning of each manualType ('unpaid with full amount as balance due, settled outside checkout'), and that complimentary records paid with isComplimentary true. It omits notes on couponId incompatibility with comp (covered in errors) and fields/ticketPwywAmounts semantics, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a real event booking on an existing event') and crucially distinguishes scope from siblings by declaring it does NOT collect card payment, which separates it from create_checkout_page. An agent can route between this and checkout instantly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates when to use each of two mutually exclusive strategies (paymentOption.manualType vs complimentary: true) with named scenarios (box-office, phone, invoiced corporate, migrations vs comped guests, speakers, staff, press). It also routes recovery: 'If the outcome of a call is uncertain, check list_bookings before trying again.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_checkout_pageAInspect
Create a new checkout page with an attached product and pricing.
Use this tool whenever a merchant wants to start accepting payments. The page is always created published and is immediately available at its hosted URL.
When the request is vague, create a minimal checkout page. Do not overcomplicate the setup with extra fields, redirects, discounts, variants, images, tracking, or copy unless the user asked for them or they are clearly required.
Prefer plain text for titles, descriptions, confirmation copy, and email copy. Only use HTML when it is genuinely needed to accomplish the task, such as when the user explicitly asks for formatting that plain text cannot express.
For the page's design and customer-facing labels (including translations), set themeOverrides and hostedLayoutType; list_theme_properties lists what can be set. Set themeId (from list_themes) to use a theme.
Fields:
Omit
fieldsto get the defaults: Name, Email address, and a required billing Address.If you pass
fields, include at least oneemailelement withtype: "email"andrequired: true, or the request fails.When tax is off and nothing is shipped, pass
fieldswith just a name and a required email field so customers are not asked for an address.To collect an address, prefer a single
element: "address"field withcollect: "billing"(or"billing_and_shipping"when you also need a shipping address). It renders a grouped address with country selector. The flat-field types (address-line1,shipping-address-line1, etc.) still work for niche cases but should not be the default.
Tax settings:
Tax is enabled by default with
mode: "stripe". Omittaxentirely unless the merchant explicitly asks to change tax behaviour.Three modes are available via
tax.mode:"stripe"- Stripe Tax calculates tax automatically based on the customer's address. Requires an address field on the page (useelement: "address") and Stripe Tax configured in the merchant's account."fixed"- A fixed tax rate is applied. Calllist_tax_ratesfirst to find an existing rate. Pass itsidasproductData.fixedTaxRateIds, or omit it to use the account's default rate. If no suitable rate exists, usecreate_tax_rateto create one first."none"- No tax is collected. Settax.enabled: falseandtax.mode: "none"(or justtax.enabled: false).
If the merchant sells B2B, add a Tax ID field such as a VAT number.
Payment options:
Only these enabled combinations are supported:
full,invoice,partial,cash_on_delivery,full + invoice,full + partial, orfull + cash_on_delivery.
Example uses:
"Create a checkout page for my $49 online course" - set name, productData.title, price.amount: 4900, price.currency: "usd"
"Create a monthly subscription at $29/month" - set price.amount: 2900, price.currency: "usd", price.recurring: { interval: "month", intervalCount: 1 }
"Create a 3-payment plan of $100 each" - set price.amount: 10000, price.currency: "usd", price.paymentPlan: { interval: "month", intervalCount: 1, planIterations: 3 }
"Create a pay-what-you-want page with a $5 minimum" - set price.amount: 500, price.payWhatYouWant: true
"Create a checkout page with a one-time price and a monthly subscription option" - set productData.prices: [{ billingType: "one_time", amount: 4900, currency: "usd", label: "One-time" }, { billingType: "recurring", amount: 1000, currency: "usd", label: "Monthly", recurring: { interval: "month", intervalCount: 1 } }]
"Create a checkout page with annual and monthly plans" - set productData.prices: [{ billingType: "recurring", amount: 9900, currency: "usd", label: "Annual", recurring: { interval: "year", intervalCount: 1 } }, { billingType: "recurring", amount: 1000, currency: "usd", label: "Monthly", recurring: { interval: "month", intervalCount: 1 } }]
After creation, return:
data.id: the checkout page IDdata.name: the internal page namedata.hostedUrl: the live checkout page URLdata.dashboardUrl: the dashboard edit URL
If the user is building or editing a website, call add_to_website next with pageId set to data.id and pageType: "checkout", and put the returned code in the site. Do not wait for the user to ask for this step.
| Name | Required | Description | Default |
|---|---|---|---|
| tax | No | Tax configuration for this page. Defaults to Stripe Tax when omitted. | |
| fees | No | ||
| name | Yes | Internal page name used in your dashboard and API responses. | |
| slug | No | Page URL slug. For events and forms the slug defaults to the slugified version of your `title`. For checkouts the slug defaults to the slugified version of your `productData.title`. | |
| fields | No | Custom checkout fields to create. When provided, at least one field must be an `email` element with `type` `email` and `required` `true`. When omitted, the page gets Name and Email address fields, plus a required billing Address on checkout and event pages. Forms get Name and Email address only. | |
| locale | No | ||
| themeId | No | The theme the page uses: one of your themes or a built-in one (see List themes). `themeOverrides` apply on top. Leave it out to use your store's default theme. | |
| imageIds | No | Array of images for the page gallery. All referenced file IDs must exist and belong to your account. | |
| redirect | No | If enabled, redirects the customer to the specified URL before the page loads. | |
| testmode | No | Puts the page in test mode. While it is on, every purchase on this page is a test purchase: no money is taken, the buyer still receives everything the page delivers, and the records are created with `livemode: false`. Turn it off to take real payments again. | |
| funnelSteps | No | Ordered funnel configuration for this page. Supports intermediate checkout steps, one-click upsells, and confirmation behavior. | |
| googleIndex | No | Allow Google to index this page for search results. Defaults to `true`. | |
| notifyEmail | No | Email addresses to send notifications to. Supports comma separated emails. | |
| productData | No | ||
| redirectUrl | No | URL to redirect to after payment. Applies if `afterPaymentAction` is `redirect`. | |
| trackingCodes | No | Custom tracking scripts to include on the page. Supports HTML `<script>` tags. | |
| paymentMethods | No | ||
| paymentOptions | No | ||
| redirectPageId | No | ID of the page (checkout, event or form) to redirect to after payment. Applies when `afterPaymentAction` is `checkout`. | |
| themeOverrides | No | The page's design and labels, set on top of its theme and nested by theme property path: `tokens.colorPrimary` is sent as `{ "tokens": { "colorPrimary": { "light": "#1A73E8" } } }`. Keys you leave out keep their current value, and `null` resets a property, or everything under a key, to the theme default. Call `list_theme_properties` for the supported properties, their value formats and, where a property has a fixed one, its default. | |
| invoiceSettings | No | ||
| redirectUrlPath | No | Additional path parameters appended to the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| hostedLayoutType | No | ||
| redirectUrlQuery | No | Query parameters for the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| allowDynamicLabel | No | ||
| allowDynamicPrice | No | ||
| allowDynamicTitle | No | Allow page title to be overridden via URL query parameters. | |
| savePaymentMethod | No | ||
| afterPaymentAction | No | Behavior after checkout. `confirmation` shows the confirmation page. `checkout` redirects to `redirectPageId`. `redirect` sends the customer to `redirectUrl`. Defaults to `confirmation`. | |
| limitSubscriptions | No | Deprecated — superseded by `productData.limitSubscriptions.enabled`. Accepted and applied to the page's product. | |
| checkoutAbandonment | No | ||
| showCouponCodeField | No | ||
| sendEmailConfirmation | No | Send an email confirmation to the customer. Defaults to `true`. | |
| redirectUrlInsideEmbed | No | If the page is embedded, redirect the customer within the embed instead of redirecting the main browser window. Defaults to `false`. | |
| allowDynamicDescription | No | Allow page description to be overridden via URL query parameters. | |
| allowDynamicRedirectUrl | No | ||
| sendPaymentNotification | No | Send payment/submission notification emails to the store owner. | |
| showCouponCodeFieldType | No | ||
| closePopupOnClickOutside | No | Whether a popup embed closes when clicking outside the container. Defaults to `false`. | |
| confirmationEmailMessage | No | Custom confirmation email message. Accepts HTML or plain text. | |
| confirmationEmailSubject | No | Custom confirmation email subject. | |
| limitSubscriptionsStripe | No | Deprecated — superseded by `productData.limitSubscriptions.limitSubscriptionsStripe.enabled`. Accepted and applied to the page's product. | |
| confirmationCheckoutTitle | No | Confirmation title. | |
| confirmationEmailShowLogo | No | Show store logo in confirmation email. | |
| allowDynamicPlanIterations | No | Allow subscription plan iterations to be overridden via URL query parameters. | |
| customizeEmailConfirmation | No | Use a custom email confirmation template. If enabled, provide `confirmationEmailSubject` and `confirmationEmailMessage`. | |
| confirmationCheckoutMessage | No | Confirmation message. Accepts HTML or plaintext. | |
| allowDynamicPreselectedPrice | No | ||
| customizeCheckoutConfirmation | No | If set to true `confirmationCheckoutMessage` and `confirmationCheckoutTitle` will be displayed on the confirmation page. Defaults to `false`. | |
| confirmationEmailShowStoreName | No | Show store name in confirmation email. | |
| allowDynamicDiscountedFromPrice | No | ||
| sendCanceledSubscriptionNotifications | No | Send notifications when subscriptions are canceled. | |
| sendRecurringPaymentFailedNotifications | No | Send notifications when recurring payments fail. | |
| enableFileAccessForInactiveSubscriptions | No | Deprecated — superseded by `productData.enableFileAccessForInactiveSubscriptions`. Accepted and applied to the page's product. | |
| sendRecurringPaymentSucceededNotifications | No | Send notifications when recurring payments succeed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, destructive=false, openWorld=true), it discloses non-obvious behavior: the page is "always created published and immediately available at its hosted URL," tax defaults to Stripe mode, omitting `fields` yields specific defaults, and omitting the required email element causes the request to fail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long, but for a 55-parameter tool the length is mostly justified and well-structured with bold section headers, front-loaded purpose, and worked examples. A few of the usage examples partially restate schema facts, but nothing is egregiously wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly complex creation tool, the description supplies guidance on defaults, failure conditions, tax/payment constraints, and the recommended follow-up call. It even restates the return fields (data.id, hostedUrl, dashboardUrl) despite an output schema existing, which is redundant but harmless and helps the agent chain the next step.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 55 parameters at 71% schema coverage, the description meaningfully supplements the schema for the highest-stakes fields: `fields` (email requirement, address grouping), `tax.mode`, the exact supported `paymentOptions` combinations, and `themeOverrides`/`hostedLayoutType`. Many lower-salience params (fees, funnelSteps, abandonment settings) are left to the schema, but the critical ones are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb+resource+scope: "Create a new checkout page with an attached product and pricing." It is immediately distinguishable from siblings like create_event, create_form, and create_booking, which build other page types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it ("whenever a merchant wants to start accepting payments") and how to behave under ambiguity ("when the request is vague, create a minimal checkout page... do not overcomplicate"). It also names the follow-up sibling (add_to_website) with the condition that triggers it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_couponAInspect
Create a coupon for Checkout Page.
Use this when a merchant wants a discount code that customers can enter on eligible pages.
How page restrictions work:
Omit both
pageIdsandticketTypeIdsto create a coupon that is usable on all checkout pages and events.Set
pageIdsto restrict the coupon to one or more specific pages.ticketTypeIdsare narrower thanpageIds: they restrict the coupon to specific ticket types within an event.If the page is an event, you must first restrict the coupon to that event by including the event page ID in
pageIds, and only then can you narrow it to certain tickets from that event withticketTypeIds.Do not pass
ticketTypeIdsby themselves. Every ticket type must belong to one of thepageIdsprovided, or the request fails.
How discount types work:
amountOffis a fixed amount discount. It requirescurrency.percentOffis a percentage discount applied to the eligible checkout total.Set exactly one of
amountOfforpercentOff, never both.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The coupon code a customer enters. | |
| label | Yes | Internal name for the coupon. | |
| pageIds | No | A list of pageIds that this coupon can be used within. | |
| currency | No | Three-letter ISO code for the currency of the amountOff parameter. Required when `amountOff` is set, and not allowed when `percentOff` is set. | |
| duration | Yes | How long the discount lasts: `once` applies to the first eligible payment, `repeating` applies for a fixed number of months, and `forever` applies until canceled or expired. | |
| redeemBy | No | The ISO datetime that this coupon must be used before. | |
| amountOff | No | A positive integer representing the amount to subtract from an invoice total (required if `percentOff` is not passed). | |
| percentOff | No | A positive float larger than 0, and smaller or equal to 100, that represents the discount the coupon will apply (required if `amountOff` is not passed). | |
| ticketTypeIds | No | List of ticket type IDs that this coupon can be used with. Ticket ticket ids must belong to a page specified in the `pageIds` array. | |
| maxRedemptions | No | The total number of times this coupon can be redeemed across all customers. Doesn't limit a single customer from redeeming multiple times. Omit for unlimited redemptions. | |
| durationInMonths | No | A positive integer representing the number of months the coupon applies for. Required when `duration === repeating`, and not allowed when `duration` is `once` or `forever`. | |
| appliesToSetupFee | No | When enabled, applies this coupon discount to the setup fee. | |
| appliesToTicketFees | No | When enabled, applies this coupon discount to ticket-level fees on event pages as well as the ticket prices. Defaults to false, which leaves ticket fees undiscounted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-open-world mutation, so the safety profile is covered. The description adds genuine behavioral rules beyond that: the pageIds/ticketTypeIds dependency and the hard failure ("or the request fails") when ticket types are passed without their parent page. It omits error behavior for duplicate codes and permission/auth requirements, keeping it out of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and trigger are front-loaded, then two bolded sections group closely related constraints. For a 13-parameter tool every sentence carries distinct operational information with no repetition of schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations cover mutation safety. The description supplies the conditional logic needed to build a valid request, though it says nothing about duplicate-code handling or what the created coupon response contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real cross-parameter meaning: the hierarchical constraint that ticketTypeIds must be narrowed from pageIds, the event-page prerequisite, and the mutual exclusion of amountOff/percentOff. These are relational rules the schema only partially implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource ("Create a coupon for Checkout Page"), which is unambiguous and clearly distinct from update_coupon/list_coupons. It does not, however, explicitly name or rule out any sibling tool, so it falls short of the top band that requires active sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this when a merchant wants a discount code that customers can enter on eligible pages" gives a clear trigger condition for invoking the tool. There is no explicit when-not or alternative-tool guidance (e.g., when to update an existing coupon instead), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventAInspect
Create a new event for selling tickets to an event.
Use this tool when a merchant wants to publish an event that sells tickets (conference, gala, workshop, class, etc.). An event has event details (at minimum a name; usually a start date/time and location) and one or more ticket groups, each containing one or more ticket types with a price (in the smallest currency unit, e.g. cents).
Examples:
Single free RSVP: one ticket group "General" with one $0 ticket "Admission".
Paid tiers: ticket types "Early Bird" 5000, "Standard" 7500, "VIP" 15000.
Capacity: set a ticket type quantity to cap how many can be sold.
Prices are integers in the smallest currency unit. Dates are ISO 8601.
For the page's design and customer-facing labels (including translations), set themeOverrides and hostedLayoutType; list_theme_properties lists what can be set. Set themeId (from list_themes) to use a theme.
After creation, return:
data.id: the event IDdata.name: the internal event namedata.hostedUrl: the live event URLdata.dashboardUrl: the dashboard edit URL
If the user is building or editing a website, call add_to_website next with pageId set to data.id and pageType: "event", and put the returned code in the site. Do not wait for the user to ask for this step.
| Name | Required | Description | Default |
|---|---|---|---|
| tax | No | ||
| fees | No | ||
| name | Yes | Internal page name used in your dashboard and API responses. | |
| slug | No | Page URL slug. For events and forms the slug defaults to the slugified version of your `title`. For checkouts the slug defaults to the slugified version of your `productData.title`. | |
| title | No | ||
| fields | No | Custom checkout fields to create. When provided, at least one field must be an `email` element with `type` `email` and `required` `true`. When omitted, the page gets Name and Email address fields, plus a required billing Address on checkout and event pages. Forms get Name and Email address only. | |
| locale | No | ||
| themeId | No | The theme the page uses: one of your themes or a built-in one (see List themes). `themeOverrides` apply on top. Leave it out to use your store's default theme. | |
| imageIds | No | ||
| redirect | No | If enabled, redirects the customer to the specified URL before the page loads. | |
| testmode | No | Puts the page in test mode. While it is on, every purchase on this page is a test purchase: no money is taken, the buyer still receives everything the page delivers, and the records are created with `livemode: false`. Turn it off to take real payments again. | |
| description | No | ||
| funnelSteps | No | Ordered funnel configuration for this page. Supports intermediate checkout steps, one-click upsells, and confirmation behavior. | |
| googleIndex | No | Allow Google to index this page for search results. Defaults to `true`. | |
| notifyEmail | No | Email addresses to send notifications to. Supports comma separated emails. | |
| redirectUrl | No | URL to redirect to after payment. Applies if `afterPaymentAction` is `redirect`. | |
| eventDetails | No | ||
| ticketGroups | No | ||
| trackingCodes | No | Custom tracking scripts to include on the page. Supports HTML `<script>` tags. | |
| paymentMethods | No | ||
| paymentOptions | No | ||
| redirectPageId | No | ID of the page (checkout, event or form) to redirect to after payment. Applies when `afterPaymentAction` is `checkout`. | |
| themeOverrides | No | The page's design and labels, set on top of its theme and nested by theme property path: `tokens.colorPrimary` is sent as `{ "tokens": { "colorPrimary": { "light": "#1A73E8" } } }`. Keys you leave out keep their current value, and `null` resets a property, or everything under a key, to the theme default. Call `list_theme_properties` for the supported properties, their value formats and, where a property has a fixed one, its default. | |
| invoiceSettings | No | ||
| redirectUrlPath | No | Additional path parameters appended to the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| hostedLayoutType | No | ||
| redirectUrlQuery | No | Query parameters for the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| allowDynamicLabel | No | ||
| allowDynamicPrice | No | ||
| allowDynamicTitle | No | Allow page title to be overridden via URL query parameters. | |
| savePaymentMethod | No | ||
| afterPaymentAction | No | Behavior after checkout. `confirmation` shows the confirmation page. `checkout` redirects to `redirectPageId`. `redirect` sends the customer to `redirectUrl`. Defaults to `confirmation`. | |
| checkoutAbandonment | No | ||
| showCouponCodeField | No | ||
| sendEmailConfirmation | No | Send an email confirmation to the customer. Defaults to `true`. | |
| redirectUrlInsideEmbed | No | If the page is embedded, redirect the customer within the embed instead of redirecting the main browser window. Defaults to `false`. | |
| allowDynamicDescription | No | Allow page description to be overridden via URL query parameters. | |
| allowDynamicRedirectUrl | No | ||
| sendPaymentNotification | No | Send payment/submission notification emails to the store owner. | |
| showCouponCodeFieldType | No | ||
| closePopupOnClickOutside | No | Whether a popup embed closes when clicking outside the container. Defaults to `false`. | |
| confirmationEmailMessage | No | Custom confirmation email message. Accepts HTML or plain text. | |
| confirmationEmailSubject | No | Custom confirmation email subject. | |
| confirmationCheckoutTitle | No | Confirmation title. | |
| confirmationEmailShowLogo | No | Show store logo in confirmation email. | |
| showConfirmationEventName | No | ||
| customizeEmailConfirmation | No | Use a custom email confirmation template. If enabled, provide `confirmationEmailSubject` and `confirmationEmailMessage`. | |
| confirmationCheckoutMessage | No | Confirmation message. Accepts HTML or plaintext. | |
| showConfirmationEventAddOns | No | ||
| allowDynamicPreselectedPrice | No | ||
| showConfirmationEventTickets | No | ||
| customizeCheckoutConfirmation | No | If set to true `confirmationCheckoutMessage` and `confirmationCheckoutTitle` will be displayed on the confirmation page. Defaults to `false`. | |
| showConfirmationAddToCalendar | No | ||
| showConfirmationEventDateTime | No | ||
| showConfirmationEventLocation | No | ||
| confirmationEmailShowStoreName | No | Show store name in confirmation email. | |
| allowDynamicDiscountedFromPrice | No | ||
| showConfirmationEventMeetingLink | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=true. The description adds real behavioral context beyond that: the structure (event details + ticket groups + ticket types), the pricing unit convention, and the exact return fields (id, name, hostedUrl, dashboardUrl). It doesn't discuss auth, limits, or side effects of failure, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose, then usage, then examples, then field/return guidance. The three short examples are efficient illustrations. A bit verbose in the design-labels paragraph, but every sentence carries guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the core flow of creating an event, naming key inputs, and enumerating return fields, so an agent can act end-to-end. Given the enormous 58-param surface, some advanced options (funnels, payment options, tax) are left to the schema, which is acceptable since output schema also exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 52%, and the description targets the most important pieces anyway: prices as integers in smallest currency unit, ISO 8601 dates, themeOverrides/hostedLayoutType usage, and themeId via list_themes. But for a 58-parameter tool with 52% coverage, the description leaves many parameters (fees, funnelSteps, paymentOptions, etc.) undocumented in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new event for selling tickets') and scopes it precisely. It distinguishes itself from siblings like create_checkout_page by emphasizing ticket-selling events and even names related tools (list_themes, add_to_website) for follow-up work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when a merchant wants to publish an event that sells tickets') with concrete examples (single free RSVP, paid tiers, capacity). It also prescribes a next action ('call add_to_website next... Do not wait for the user to ask'), which is unusually actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_fieldAInspect
Add one custom field to an existing checkout page, form, or event. Appended after the current fields unless order is given. Visibility rules must reference existing field and option IDs from the page detail response. Mutating; to add fields on a new page, pass fields to the create tool instead.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Used to store field data in a predictable manner. Please note that you must use Customer Name and Shipping Address if you wish to use any of the shipping address data types. Do not set `type` when `element` is one of: `checkbox`, `quantity`, `tax-id`, `po-number`, `multiple-choice`, `multi-select`, `date-time`, `date`, `time`, `textarea`. | |
| label | Yes | Form label for the input element. | |
| order | No | Display order of this field. When omitted, order is determined by the position of the field in the array. | |
| hidden | No | Whether this field is hidden from customers at checkout. | |
| layout | No | How a multi-select field is drawn at checkout: `dropdown` (the default) or `list`, a list of checkboxes. Ignored on other elements. | |
| pageId | Yes | The ID of the page the field belongs to. | |
| collect | No | Whether to collect only a billing address or both billing and shipping. Applies to `address` elements. Defaults to `billing`. | |
| element | No | Input control used to render this field in checkout. Defaults to `text`. | |
| options | No | Selectable options. Applies to `select`, `multi-select` and `multiple-choice` elements. Options on a `multi-select` need different values (an option without a value uses its label), and options on a `multiple-choice` need different labels. | |
| maxValue | No | Maximum allowed value settings for this field. | |
| minValue | No | Minimum allowed value settings for this field. | |
| pageType | Yes | The kind of page the field belongs to: `checkout`, `form`, or `event`. Use the type of the tool you fetched the page with (get_checkout_page, get_form, get_event). | |
| required | No | Whether this field must be completed before checkout can continue. | |
| reference | No | External reference ID for integration purposes. Generated from the field type or label when omitted. | |
| description | No | Optional helper text shown below the field label. | |
| placeholder | No | Specifies a short hint that describes the expected value of an input element | |
| defaultValue | No | Default value settings for the field. | |
| showHideLogic | No | Conditional visibility rules for this field. `element.elementId` must be the ID of an existing field on the same page, and `value` an option ID on that field (or `TRUE`/`FALSE` for a checkbox). Read the IDs from the page detail response; create-time keys are rejected here. | |
| defaultCountry | No | ISO 3166-1 alpha-2 country code used as the default for `address` elements. Defaults to `US`. | |
| collectShippingPhone | No | Whether to collect a phone number alongside the shipping address. Applies to `address` elements when `collect` is `billing_and_shipping`. Defaults to `false`. | |
| showSelectedDialCode | No | Whether to display the selected international dial code in phone inputs. | |
| limitAllowedCountries | No | Country restriction settings for country-based fields. | |
| limitBillingCountries | No | Restrict the billing country list. Applies to `address` elements. | |
| limitShippingCountries | No | Restrict the shipping country list. Applies to `address` elements when `collect` is `billing_and_shipping`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so safety is covered; the description adds genuine behavior beyond that: fields are appended by default, order overrides placement, and visibility rules must reference existing field/option IDs from the page detail response. The word 'Mutating' is redundant with the annotations, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense clauses, front-loaded with the action and scope, then ordering behavior, a prerequisite, and sibling routing. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, 100% schema coverage, and annotations covering the safety profile, the description only needs to add scope, ordering, prerequisites, and routing — all of which it does. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for the `order` parameter ('Appended after the current fields unless order is given') that the schema's array-position phrasing does not convey for a single-field call. It also surfaces the ID-reference constraint that governs showHideLogic values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add one custom field') and constrains scope to an existing checkout page, form, or event. That scope constraint cleanly separates it from create_checkout_page/create_form/create_event and from update_field/delete_field siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes one case to an alternative ('to add fields on a new page, pass fields to the create tool instead'), which is real when-to-use guidance. It does not, however, mention update_field or delete_field as alternatives for modifying/removing an existing field, so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_formAInspect
Create a new form page for lead capture or submissions.
Use this tool when a merchant wants to publish a form that collects customer information, optionally shows custom confirmation copy, and can deliver downloadable files after submission.
Prefer a minimal request when the user is vague, and only add optional fields like custom copy, redirects, images, files, or tracking when requested.
For the page's design and customer-facing labels (including translations), set themeOverrides and hostedLayoutType; list_theme_properties lists what can be set. Set themeId (from list_themes) to use a theme.
After creation, return:
data.id: the form page IDdata.name: the internal page namedata.hostedUrl: the live form URLdata.dashboardUrl: the dashboard edit URL
If the user is building or editing a website, call add_to_website next with pageId set to data.id and pageType: "form", and put the returned code in the site. Do not wait for the user to ask for this step.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Internal page name used in your dashboard and API responses. | |
| slug | No | Page URL slug. For events and forms the slug defaults to the slugified version of your `title`. For checkouts the slug defaults to the slugified version of your `productData.title`. | |
| title | No | Public title shown to customers on the page. | |
| fields | No | Custom checkout fields to create. When provided, at least one field must be an `email` element with `type` `email` and `required` `true`. When omitted, the page gets Name and Email address fields, plus a required billing Address on checkout and event pages. Forms get Name and Email address only. | |
| locale | No | ||
| fileIds | No | Array of file IDs for downloadable files. All file IDs must exist and belong to your account. | |
| themeId | No | The theme the page uses: one of your themes or a built-in one (see List themes). `themeOverrides` apply on top. Leave it out to use your store's default theme. | |
| imageIds | No | Array of images for the page gallery. All referenced file IDs must exist and belong to your account. | |
| redirect | No | If enabled, redirects the customer to the specified URL before the page loads. | |
| testmode | No | Puts the page in test mode. While it is on, every purchase on this page is a test purchase: no money is taken, the buyer still receives everything the page delivers, and the records are created with `livemode: false`. Turn it off to take real payments again. | |
| description | No | Page description shown to customers. Accepts HTML or plain text. | |
| formDetails | No | Form behaviour settings. | |
| funnelSteps | No | Ordered funnel configuration for this page. Supports intermediate checkout steps, one-click upsells, and confirmation behavior. | |
| googleIndex | No | Allow Google to index this page for search results. Defaults to `true`. | |
| notifyEmail | No | Email addresses to send notifications to. Supports comma separated emails. | |
| redirectUrl | No | URL to redirect to after payment. Applies if `afterPaymentAction` is `redirect`. | |
| trackingCodes | No | Custom tracking scripts to include on the page. Supports HTML `<script>` tags. | |
| redirectPageId | No | ID of the page (checkout, event or form) to redirect to after payment. Applies when `afterPaymentAction` is `checkout`. | |
| themeOverrides | No | The page's design and labels, set on top of its theme and nested by theme property path: `tokens.colorPrimary` is sent as `{ "tokens": { "colorPrimary": { "light": "#1A73E8" } } }`. Keys you leave out keep their current value, and `null` resets a property, or everything under a key, to the theme default. Call `list_theme_properties` for the supported properties, their value formats and, where a property has a fixed one, its default. | |
| invoiceSettings | No | ||
| redirectUrlPath | No | Additional path parameters appended to the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| hostedLayoutType | No | ||
| redirectUrlQuery | No | Query parameters for the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| allowDynamicTitle | No | Allow page title to be overridden via URL query parameters. | |
| afterPaymentAction | No | Behavior after checkout. `confirmation` shows the confirmation page. `checkout` redirects to `redirectPageId`. `redirect` sends the customer to `redirectUrl`. Defaults to `confirmation`. | |
| sendEmailConfirmation | No | Send an email confirmation to the customer. Defaults to `true`. | |
| redirectUrlInsideEmbed | No | If the page is embedded, redirect the customer within the embed instead of redirecting the main browser window. Defaults to `false`. | |
| allowDynamicDescription | No | Allow page description to be overridden via URL query parameters. | |
| sendPaymentNotification | No | Send payment/submission notification emails to the store owner. | |
| closePopupOnClickOutside | No | Whether a popup embed closes when clicking outside the container. Defaults to `false`. | |
| confirmationEmailMessage | No | Custom confirmation email message. Accepts HTML or plain text. | |
| confirmationEmailSubject | No | Custom confirmation email subject. | |
| confirmationCheckoutTitle | No | Confirmation title. | |
| confirmationEmailShowLogo | No | Show store logo in confirmation email. | |
| customizeEmailConfirmation | No | Use a custom email confirmation template. If enabled, provide `confirmationEmailSubject` and `confirmationEmailMessage`. | |
| confirmationCheckoutMessage | No | Confirmation message. Accepts HTML or plaintext. | |
| customizeCheckoutConfirmation | No | If set to true `confirmationCheckoutMessage` and `confirmationCheckoutTitle` will be displayed on the confirmation page. Defaults to `false`. | |
| confirmationEmailShowStoreName | No | Show store name in confirmation email. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds useful operational context — the post-creation workflow and the mandate to call add_to_website next — but says nothing about auth requirements, rate limits, or side effects of creation beyond what annotations imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and conditional usage, then workflow. The bulleted list of return fields (data.id, data.name, data.hostedUrl, data.dashboardUrl) is partially redundant with the output schema, which is the only real slack in an otherwise tight description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a create tool with 38 params, 1 required, a rich schema, and an output schema, the description supplies what the structured fields cannot: the minimal-vs-rich request heuristic and the mandatory next-step routing to add_to_website. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 92%, so the baseline is 3. The description goes beyond the schema by telling the agent to use themeOverrides/hostedLayoutType for design and labels and to consult list_theme_properties and list_themes, which is real navigational value for the most complicated optional parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+domain: 'Create a new form page for lead capture or submissions.' That cleanly distinguishes it from sibling tools like create_checkout_page, create_event, and create_booking, and an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong positive guidance ('use this tool when a merchant wants to publish a form...', 'Prefer a minimal request when the user is vague, and only add optional fields...when requested') and calls out related tools (list_theme_properties, list_themes, add_to_website). It does not explicitly state when NOT to use it versus create_checkout_page/create_event, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tax_rateADestructiveInspect
Create a fixed tax rate for use on checkout pages.
Use this tool when a merchant wants to charge a fixed percentage tax (VAT, GST, Sales Tax, etc.) on their checkout pages. Fixed tax rates are used with pages that have tax.mode: "fixed".
Inclusive vs exclusive:
Exclusive (
inclusive: false) — tax is added on top of the price. A $100 product with 20% tax costs the customer $120.Inclusive (
inclusive: true) — tax is already included in the price. A $100 product with 20% inclusive tax means $83.33 + $16.67 tax.
Default rate:
Set
default: trueto make this the account's default tax rate. Pages withtax.mode: "fixed"and no explicitfixedTaxRateIdswill use the default rate automatically.Only one tax rate can be the default at a time. Setting a new default replaces the previous one.
This is not Stripe Tax. Fixed tax rates apply a flat percentage regardless of customer location. To calculate tax dynamically by address, use tax.mode: "stripe" on the page instead (no tax rate needed).
| Name | Required | Description | Default |
|---|---|---|---|
| default | No | Whether this should be the default tax rate. When `true`, this rate is pre-selected for pages using fixed tax mode and no explicit `fixedTaxRateIds`. | |
| inclusive | Yes | Whether the tax is inclusive (`true`, meaning it is already included in the price) or exclusive (`false`, meaning it is added on top of the price). | |
| percentage | Yes | Tax rate percentage out of 100. Maximum 2 decimal places. | |
| displayName | Yes | Short name describing the type of tax, for example VAT, GST, or Sales Tax. Displayed in the checkout and invoices. Maximum 50 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=false and readOnlyHint=false. The description adds real behavioral context beyond that: the default-replacement side effect ('Only one tax rate can be the default at a time. Setting a new default replaces the previous one'), which explains WHY a create tool is flagged destructive. It does not discuss response shape, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose immediately followed by routing guidance, then bolded sub-sections for inclusive/exclusive, default, and the Stripe Tax distinction. Every section earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations carry the safety profile. The description covers usage, the inclusive/exclusive semantics, and the default-replacement side effect, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema with a worked example ($100 with 20% inclusive tax = $83.33 + $16.67) and the default-rate selection behavior, extending the terse schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a fixed tax rate for use on checkout pages') and the effect on the account. An agent can immediately tell this apart from read-only siblings like list_tax_rates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it (merchant wants a fixed percentage VAT/GST/Sales Tax on fixed-mode pages) and when NOT to, routing the agent to `tax.mode: "stripe"` for dynamic/address-based tax instead. Clear positive and negative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_themeAInspect
Create a reusable theme. Pass baseThemeId (from list_themes) to start from an existing theme's full design, then set what should differ in variables. Call list_theme_properties for the supported properties. Apply it to pages with themeId on create/update_checkout_page, create/update_event or create/update_form.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Theme name, unique within your account. | |
| variables | No | Design and labels to set, in the same shape as a page's `themeOverrides`. Keys you leave out keep their value, and `null` resets a property, or everything under a key. Call `list_theme_properties` for the supported properties. | |
| baseThemeId | No | A theme to start from: one of your themes or a built-in one. The new theme copies all of its settings, including order bump styling, which only the dashboard can change, and `variables` is applied on top. A copy of a built-in theme does not pick up your store's brand color automatically; set `tokens.colorPrimary` if you want it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the basic safety profile (non-readonly, non-destructive, closed-world). The description goes well beyond that: the baseThemeId copy includes order bump styling that only the dashboard can change, a copy of a built-in theme does not inherit the store's brand color unless tokens.colorPrimary is set, and omitted variable keys retain their values while null resets them. These are non-obvious side effects an agent could not infer from any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, front-loaded with the core action and then building outward to prerequisites and application. Every sentence carries distinct, actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter create tool with an output schema and full annotation coverage, the description supplies the creation workflow, dependency calls, and override semantics. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so name, variables and baseThemeId are already well documented in the schema. The description mostly restates that documentation (the list_theme_properties pointer appears verbatim in both places) rather than adding new parameter syntax or constraints. Baseline 3 is appropriate when the schema carries the detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a reusable theme") and immediately situates it in a workflow with named siblings (list_themes, list_theme_properties, create/update_checkout_page). An agent can distinguish this from update_theme or get_theme without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-and-how: use baseThemeId from list_themes to inherit a design, then set deltas in variables, and call list_theme_properties for supported keys. It also explains where the result gets applied. It stops short of distinguishing this tool from the sibling update_theme, so the alternative routing is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ticket_typeAInspect
Add one ticket type to a ticket group on an existing event: name, price, capacity, sale window and display options. Get the event and group IDs from get_event. Mutating; to create a new event with its tickets in one call, use create_event instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| price | No | ||
| hidden | No | ||
| pageId | Yes | The ID of the event. Event IDs come from list_events, or the `id` that create_event returns. | |
| status | No | ||
| imageId | No | ID of an image file for the ticket type, uploaded with `upload_file` (purpose `image`). | |
| pricing | No | ||
| capacity | No | ||
| feeAmount | No | ||
| reference | No | ||
| saleEndOn | No | ||
| description | No | ||
| maxQuantity | No | ||
| minQuantity | No | ||
| saleStartOn | No | ||
| ticketGroupId | Yes | The ID of the ticket group to add the ticket type to. get_event lists the event's groups under `ticketGroups[].id`. | |
| hideWhenSoldOut | No | ||
| hideWhenNotOnSale | No | ||
| hideWhenScheduled | No | ||
| pwywSuggestedPrice | No | ||
| discountedFromPrice | No | ||
| hideWhenUnavailable | No | ||
| showTicketSaleDates | No | ||
| triggerTicketTypeId | No | ID of another ticket type on the same event whose sale end or sell-out makes this one available. Required when `availabilityBehavior` is `after_ticket_sale_ends`, `after_ticket_sold_out` or `after_ticket_ends_or_sold_out`. Find it under `ticketGroups[].ticketTypes[].id` in get_event. | |
| availabilityBehavior | No | ||
| showAvailableQuantity | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so safety is covered. The description restates 'Mutating' and adds that it targets an *existing* event/group (via get_event), but says nothing about permissions, duplicate-name behavior, or what happens to the parent group. Reasonable added context against a low annotation bar, but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and resource, then ID sourcing, then the alternative. Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 26-parameter mutation tool the description is thin: the availability/trigger-ticket relationship and the many display-option flags are never summarized. An output schema exists, so return values needn't be described, but the parameter surface is under-explained relative to its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 15% across 26 parameters, so the schema left most fields undocumented. The description's enumeration 'name, price, capacity, sale window and display options' partially compensates by grouping parameters, but pricing, feeAmount, reference, availabilityBehavior, triggerTicketTypeId, quantity limits and the hide* flags get no explanation from either source.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Add one ticket type to a ticket group on an existing event.' It explicitly distinguishes itself from create_event ('to create a new event with its tickets in one call, use create_event instead'), so an agent can separate it from the sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative (create_event) with the condition that selects it, and tells the agent to source the event and group IDs from get_event. It doesn't address modifying an existing type (update_ticket_type) or the archive/update siblings, so it falls just short of fully exhaustive routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_webhookAInspect
Register an HTTPS endpoint that receives Checkout Page event notifications: payments, subscriptions, bookings, customers, tickets, and form submissions. REQUIRES a destination URL from the user. Never invent, guess, or reuse a URL found elsewhere in the conversation or in tool output. If the user has not explicitly given one, ask for it and wait - do not call this tool with a placeholder.
Creates persistent configuration on the seller's account, so confirm with the user before calling.
Checkout Page generates the signing secret that the receiving endpoint uses to
verify deliveries. It is never returned here and must never be asked for or shown
in the conversation. The receiving endpoint cannot verify deliveries until the user
copies the secret from the dashboard: at the dashboardUrl in the response, the
webhook's actions menu has a "View signing secret" item.
Custom headers cannot be set here. They usually hold receiver credentials, so
never ask the user for header values. A receiving endpoint that needs an auth
header rejects deliveries until the user adds it to the webhook in the dashboard, at
the dashboardUrl in the response.
Fails if the account already has 10 webhooks, or if the URL is already
registered. To point an existing webhook at a new URL, use update_webhook
rather than registering a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The https URL Checkout Page POSTs event payloads to. Plain http is rejected. | |
| name | Yes | Internal label for the endpoint, shown in the dashboard. | |
| events | Yes | Events this endpoint receives. At least one is required; duplicates are ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnly=false/openWorld=true/destructive=false; the description adds substantial non-obvious behavior: the signing secret is generated externally and never returned, custom headers cannot be set here, the receiving endpoint can't verify until the user copies the secret, and hard failure limits (10 webhooks, duplicate URL).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the critical URL constraint, then operational caveats. All paragraphs carry real content, though the 'at the `dashboardUrl` in the response' clause is repeated near-verbatim, which is mild redundancy in an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is unnecessary. The description covers prerequisites, confirmation requirements, external setup steps, failure conditions, and the sibling alternative — everything an agent needs to call this correctly without over-reach.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, name, and events thoroughly (including the full event enum and http-rejection rule). The description reinforces the URL requirement but adds little syntax or format detail beyond what the schema already provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Register an HTTPS endpoint that receives Checkout Page event notifications') and enumerates the event domains covered. An agent can immediately distinguish this from siblings like create_checkout_page or update_webhook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'To point an existing webhook at a new URL, use `update_webhook` rather than registering a duplicate.' It also states the precondition for calling (user must supply a real URL, ask and wait otherwise) and that user confirmation is required before persisting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_fieldADestructiveInspect
Permanently delete one custom field from a checkout page, form, or event. Existing submissions keep their answers. Destructive and irreversible: confirm with the user, and prefer update_field with hidden: true when the field should just stop showing.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | The ID of the page the field belongs to. | |
| fieldId | Yes | The ID of the field. Field IDs are listed under `fields` in the page detail response from get_checkout_page, get_form, or get_event. | |
| pageType | Yes | The kind of page the field belongs to: `checkout`, `form`, or `event`. Use the type of the tool you fetched the page with (get_checkout_page, get_form, get_event). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description still adds real context: permanence/irreversibility and the non-obvious fact that existing submissions retain their answers. It does not cover permission requirements or error behavior, so it falls just short of fully rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler: the destructive scope leads, then the data-retention nuance, then the safer alternative. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers the remaining agent-facing needs: irreversibility, user confirmation, and the safer alternative path. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (pageId, fieldId, pageType) are already documented in the schema, including how to obtain fieldId and which pageType to use. The description adds no additional parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (one custom field) plus the exact scope of page types it applies to (checkout page, form, event). The contrast with update_field makes it easy to distinguish from the adjacent mutation sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this (permanent removal) versus when to use an alternative (update_field with hidden: true when the field should just stop showing). It also instructs the agent to confirm with the user first, which is actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_themeADestructiveInspect
Delete a theme you created. Fails while pages use it or while it is the store's default theme: move those pages to another theme first. Destructive and irreversible. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| themeId | Yes | The theme ID, as returned by list or create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, yet the description goes further by disclosing two concrete server-side failure modes (theme in use by pages, theme is store default), stating irreversibility, and requiring user confirmation. This is exactly the extra behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the failure conditions, then the safety instruction. No filler and no repetition of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation; the description instead covers the things the schema cannot: preconditions, irreversibility, and the confirmation requirement. Complete for a single-parameter destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (themeId) and schema description coverage is 100%, with the pattern and sourcing ('as returned by list or create') documented in the schema itself. The description adds no format or sourcing detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete a theme') and adds scope ('you created'), which cleanly distinguishes it from create_theme, update_theme, and get_theme in the sibling list. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions for when the call succeeds or fails (pages in use, default theme) and prescribes the remedy (move pages first) plus a user-confirmation step. It does not name a sibling alternative, but for a delete there is effectively none, so this is strong context without formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_webhookADestructiveInspect
Delete a webhook endpoint by id. Deliveries stop immediately and the endpoint disappears from list_webhooks; its delivery history is kept. Destructive and irreversible. Confirm with the user and use list_webhooks to find the id first.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookId | Yes | The webhook ID, as returned by create or list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | A webhook endpoint subscribed to one or more events. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/readOnlyHint annotations by disclosing concrete consequences: deliveries stop immediately, the endpoint vanishes from list_webhooks, and delivery history is retained. It also flags irreversibility and a confirmation requirement, which is exactly the behavioral context an agent needs for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and consequences, then the caution and the prerequisite. Every clause carries information; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the single required parameter is fully covered. The description supplies the destructive consequence model and the pre-call workflow, leaving no gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the webhookId parameter, its 24-hex-char pattern, and its provenance ('as returned by create or list') are already documented. The description only reinforces 'by id' and points to list_webhooks, adding no format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (webhook endpoint) scoped 'by id', clearly separating it from list_webhooks, get_webhook, create_webhook and update_webhook. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit workflow guidance: confirm with the user before invoking, and use list_webhooks to resolve the id first. It names the alternative tool for id lookup, though it does not spell out explicit when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookingARead-onlyInspect
Retrieve a single event booking by ID from your Checkout Page account. Pass livemode: false to read test-mode records.
Use list_bookings first if you need to discover a booking ID by customer email, customer name, event title, or order ID. Checkout payments are a separate record type — use list_payments for those.
If the booking ID does not exist for the authenticated seller, returns a 404 error: "Booking not found".
Ticket capacity and ticketGroupCapacity are historical snapshots from booking time and do not reflect current availability — do not use them for inventory calculations.
A booking with isComplimentary: true was issued by the merchant at no charge: it is status: paid with amount, amountPaid and amountDue of 0, while the ticket lines keep their face value and complimentaryDiscountAmount holds the amount forgone.
Example uses:
"Fetch booking 6812fe6e9f39b6760576f01c"
"Show me the full details of this booking"
"Which tickets were purchased on this booking?"
This tool is read-only. Ticket transfers, cancellations, and refunds must be performed in the Checkout Page dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| bookingId | Yes | The ID of the booking to retrieve. Use `list_bookings` first if you need to discover the booking ID by email, name, customer, event, or date range. Payments for checkout pages have their own IDs and are not retrievable here. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, but the description goes well beyond them: it documents 404 error text, warns that capacity values are historical snapshots and must not be used for inventory math, explains the isComplimentary flag's status/amount semantics, and states that mutations (transfers, cancellations, refunds) are dashboard-only. That is exactly the extra context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered constraints, edge cases, and example utterances. Despite its length, every block carries distinct decision-relevant content (routing, error behavior, snapshot caveat, complimentary semantics, read-only boundary) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only single-record fetch with full schema coverage, an output schema, and no nested objects needs little more; the description still covers error behavior and non-obvious field semantics. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, and the description's livemode and bookingId guidance largely restates the schema. It adds only marginal framing (e.g., that payment IDs are not retrievable here), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a single event booking by ID') and immediately scopes it to the seller's own Checkout Page account. It explicitly distinguishes itself from the two most confusable siblings, list_bookings and list_payments, so an agent can select it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: use list_bookings to discover an ID by email, name, event title, or order ID, and use list_payments for checkout payments. It also states the when-not case (this tool cannot read payments) and the failure condition (404 if the ID isn't owned by the authenticated seller).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_checkout_pageARead-onlyInspect
Retrieve a single checkout page by ID from your Checkout Page account.
Use this tool when you already know the checkout page ID and want to inspect the current configuration.
If the checkout page ID does not exist, returns a 404 error: "Checkout page not found".
Example uses:
"Fetch checkout page 6812fe6e9f39b6760576f01c"
"Show me the current settings for checkout page X"
"Check whether this checkout page is draft, published or archived"
"Inspect the product, files, images, or redirect settings on this page"
For create flows, use create_checkout_page. For a direct lookup after creation, pass the returned page id into this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | The ID of the checkout page to retrieve. You can get this from `create_checkout_page`, the dashboard, or another Checkout Page API response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered structurally. The description adds real behavioral context beyond that: the exact 404 failure mode and message, and the fact that the returned configuration includes status (draft/published/archived), product, files, images, and redirect settings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and usage condition in the first two sentences, then alternatives, then examples. The four example utterances are somewhat repetitive but each exercises a distinct intent (fetch, inspect settings, check status, inspect sub-resources), so they earn most of their space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return-shape detail is unnecessary, and the description still covers the one thing the schema can't: the 404 error path. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single pageId parameter is already documented with its 24-char hex pattern and sourcing guidance, so the description's 'by ID' adds little. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Retrieve a single checkout page by ID') and immediately scopes it to an existing-resource lookup, which cleanly separates it from list_checkout_pages, create_checkout_page, and update_checkout_page in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('when you already know the checkout page ID') and routes the agent elsewhere for the adjacent flow ('For create flows, use `create_checkout_page`'). It even covers the chained workflow of passing the id returned by creation into this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_customerARead-onlyInspect
Retrieve a single customer by ID from your Checkout Page account.
Returns one customer record directly by ID, without pagination.
Use list_customers first if you need to discover a customer ID by email or name. Use this tool when you already have the ID.
If the customer ID does not exist, returns a 404 error: "Customer not found".
For modification requests, show what's currently stored. The merchant can edit the customer record directly in the Checkout Page dashboard. The customer can also update their own details through the customer portal. For data deletion (GDPR/privacy), this requires human intervention in the dashboard.
The top-level address field is the billing address. The shipping.address field is the shipping address. These are separate and often don't match. When asked about "my address" without specifying which, present both addresses clearly labelled (e.g. "Billing address: … / Shipping address: …"). Don't return only one when both exist, and don't return the billing address in response to a shipping address question.
Customer records are identity/profile only — no purchase history, no transaction amounts.
Cross-tool routing:
To see what this customer has bought, use their id as the customerId filter on the transaction tools:
list_payments(customerId: "...")— one-time purchases, digital products, invoices.list_bookings(customerId: "...")— event tickets and registrations.list_subscriptions(customerId: "...")— recurring billing.
Records do not overlap between transaction tools — a transaction only appears in one tool. No risk of double-counting when combining results.
For a complete customer picture, call get_customer for profile data, then query the transaction tools with the same ID.
Example uses (not exhaustive):
"Fetch customer 6812fe6e9f39b6760576f01c" → direct lookup by ID
"Show me the full customer profile for this customer ID" → returns all available fields
"Show me the profile and orders for customer X" →
get_customerfor profile, then fan out to transaction tools withcustomerId
Example customer support uses:
Customer asking what information is stored about them — look up by ID, return all stored profile fields. Note that customer records only contain profile data — for a complete picture of what's stored, also query the transaction tools with
customerIdto show their purchase history.Customer wants to update their address, phone number, or email — look up current profile, present what's on file. The merchant can edit the customer record directly in the Checkout Page dashboard. The customer can also update their own details through the customer portal.
Customer says the name on their account is wrong — look up profile, check
namefield. If ashipping.namealso exists and differs, present both. The merchant can update the name in the Checkout Page dashboard; the customer can update it via the portal.Customer requesting deletion of their personal data — GDPR/privacy request. Look up the full profile, show what's stored, and explain that data deletion requires human intervention in the Checkout Page dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | The ID of the customer to retrieve. Use `list_customers` first if you need to discover the customer ID by name or email. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/non-destructive profile, and the description adds substantial context beyond them: the 404 error text for missing IDs, no pagination, the identity-only scope (no purchase history), the non-overlapping transaction tools, and that deletion requires human intervention in the dashboard.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded with purpose and routing, but bloated and repetitive: the dashboard/portal edit path and the GDPR deletion requirement each appear twice (once in the body, once under 'Example customer support uses'). Multiple example sections restate the same guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return values needn't be explained, yet the description still covers the billing vs. shipping address distinction, identity-only scope, and routing to transaction tools. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a documented pattern and the 'use list_customers first' hint already in the schema, so the description largely repeats the schema's ID semantics. Baseline 3 is appropriate since the schema does the heavy lifting for the single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a single customer by ID') and immediately scopes it ('without pagination', 'one customer record directly by ID'). It explicitly distinguishes itself from the sibling list_customers by clarifying that it is for when you already have the ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (list_customers) and the exact condition that selects it (discovering an ID by email/name), and adds cross-tool routing to list_payments/list_bookings/list_subscriptions with the customerId filter. It also states when-not behavior (ID not found returns 404).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventARead-onlyInspect
Retrieve a single event page and its full configuration by ID. Use create_event to create one; pass its returned id here for a direct lookup, or before a partial update with update_event.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | The ID of the event page to retrieve. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds that the response includes the 'full configuration' and positions the call in a create/update workflow, but discloses no auth needs, rate limits, or freshness behavior beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded, followed by the workflow context. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-entity getter with an output schema that carries the return shape, the description supplies the purpose, the id source, and the surrounding workflow. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single pageId parameter already documents its role, ID format, and example. The description adds no format or constraint detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve), resource (a single event page and its full configuration), and lookup key (by ID). This cleanly distinguishes it from list_events (plural) and create_event without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly ties usage to the workflow: pass an id returned by create_event for a direct lookup, or call it before a partial update with update_event. It names the related tools but never states the exclusion case (e.g. use list_events when you don't have an id), so it falls just short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_formARead-onlyInspect
Retrieve a single form by ID from your Checkout Page account.
Use this tool when you already know the form ID and want to inspect the current configuration.
If the form ID does not exist, returns a 404 error: "Form not found".
Example uses:
"Fetch form 6812fe6e9f39b6760576f01c"
"Show me the current settings for form X"
"Check whether this form is draft, published or archived"
"Inspect the fields, files, images, or redirect settings on this form"
For create flows, use create_form. For a direct lookup after creation, pass the returned page id into this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | The ID of the form to retrieve. You can get this from `create_form`, the dashboard, or another Checkout Page API response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered structurally. The description adds genuine behavioral context beyond that: the not-found error message and the kinds of state (draft/published/archived) and settings it exposes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in one sentence, then usage, then error behavior. The four example uses are somewhat repetitive with the guidance above, costing a little efficiency, but each sentence still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values needn't be described. For a single-parameter read tool with full annotation coverage, the purpose, routing, error behavior, and ID sourcing are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the pageId pattern/description already document format and provenance. The description's only addition is naming `create_form` as a source of the ID, which is marginal beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retrieve) and resource (a single form by ID), and the phrase 'single form by ID' distinguishes it from list_forms and from the many other get_* siblings that target different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the condition ('when you already know the form ID and want to inspect the current configuration'), routes create flows to `create_form`, and explains the post-creation lookup path. The 404 case is also covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceARead-onlyInspect
Retrieve a single invoice by id. Pass livemode: false to read test-mode records. invoiceUrl links to the hosted PDF, the document customers usually ask for. Each response signs a new link, safe to share with the buyer, that expires 1 hour after the response. Use list_invoices first to discover an id by customer, invoice number, PO number, or the payment it belongs to (chargeId). Read-only; use regenerate_invoice to rebuild the PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The ID of the invoice to retrieve. Use `list_invoices` first if you need to discover the invoice ID by customer email, customer name, invoice number, PO number, or the payment it belongs to (`chargeId`). | |
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description goes beyond them by disclosing that each response signs a new invoiceUrl, that the link expires 1 hour after the response, and that it is safe to share with the buyer, plus livemode test-record behavior. It does not cover error modes or rate limits, but the added behavioral context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers usage routing and behavioral detail in short, purposeful sentences. Slightly dense with the URL-expiry tangent, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with a full output schema, the description covers routing, mode selection, and the key return field's behavior. An agent has everything needed to call it correctly; output-schema details need not be restated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both id and livemode. The description's mention of livemode: false for test-mode records largely duplicates the schema, so it sits at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a single invoice by id') and clearly scopes it as a single-record fetch, distinguishing it from list_invoices and regenerate_invoice by name. An agent can route to it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to use list_invoices first to discover an id (by customer, invoice number, PO number, or chargeId), and names regenerate_invoice as the alternative for rebuilding the PDF. Both the when-to-use and the when-to-use-something-else conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_paymentARead-onlyInspect
Retrieve a single payment by ID from your Checkout Page account. Pass livemode: false to read test-mode records.
Use list_payments first if you need to discover a payment ID by customer email, customer name, product title, or order ID. Event bookings are a separate record type — use list_bookings for those.
If the payment ID does not exist for the authenticated seller, returns a 404 error: "Payment not found".
Example uses:
"Fetch payment 6812fe6e9f39b6760576f01c"
"Show me the full details of this payment"
"Was this payment refunded, and how much?"
This tool is read-only. Refunds and cancellations must be performed in the Checkout Page dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| paymentId | Yes | The ID of the payment to retrieve. Use `list_payments` first if you need to discover the payment ID by email, name, customer, page, product, or date range. Bookings for event pages have their own IDs and are not retrievable here. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description goes further by disclosing the seller-scoped authorization ('for the authenticated seller'), the exact 404 behavior on a missing ID, and the test-mode-vs-live record distinction, all genuine behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, then routing guidance, then failure/behavior notes, then concrete examples. The read-only statement is partly redundant with readOnlyHint but is a short, high-value reinforcement for a retrieval tool rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is rightly omitted. For a single-record getter, the description covers purpose, routing to siblings, auth scoping, error behavior, and mode switching — nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (paymentId, livemode) are already fully documented in the schema, which sets the baseline at 3. The description restates the livemode:false test-mode behavior and the ID-discovery hint, adding reinforcement but no syntax or format details the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Retrieve a single payment by ID') and immediately scopes it to the Checkout Page account. It explicitly distinguishes itself from the record types an agent might confuse it with (bookings vs. payments), which is exactly the differentiation needed among 50+ siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternatives and the conditions selecting them: use `list_payments` first to discover an ID by email/name/product/order, and use `list_bookings` for event bookings. It even states the failure mode (404 'Payment not found') and where mutations must happen instead (the dashboard).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productARead-onlyInspect
Retrieve a single product by ID, including its prices, variants, stock, tax and file settings. Product IDs come from a page response (data.product.id on get_checkout_page). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | The ID of the product to retrieve. Find it on a page response as `data.product.id` (see `get_checkout_page`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, and the description's 'Read-only' simply restates that. The list of included sub-resources (prices, variants, stock, tax, file settings) adds some scope context, but nothing about permissions, error behavior, or data staleness is disclosed, which is acceptable given the lower bar set by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the action and scope, followed by the one piece of operational guidance an agent needs (where to get the ID). No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully covered single-parameter schema, an output schema covering return values, and annotations covering the safety profile, the description supplies everything essential for correct invocation. Only auth/permission context and any error semantics are absent, which are minor gaps for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already documents both the format pattern and the provenance of the ID. The description merely echoes the same ID-source guidance, adding no syntax or filtering detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Retrieve) plus resource (a single product by ID) with an explicit enumeration of the returned sub-resources (prices, variants, stock, tax, file settings). The 'single product by ID' + 'Read-only' framing clearly separates it from update_product and the get_* siblings that target other entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent where the required productId comes from (data.product.id on get_checkout_page), which is practical usage guidance. However, it never states when to reach for this tool versus other getters/updaters or what prerequisites exist, so usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_submissionARead-onlyInspect
Retrieve a single form submission by ID from your Checkout Page account. Pass livemode: false to read test-mode records.
Returns one submission record directly by ID, without pagination.
Use list_submissions first if you need to discover a submission ID by customer email, customer name, page, customer ID, or date range.
If the submission ID does not exist, returns a 404 error: "Submission not found".
Example uses:
"Fetch submission 6812fe6e9f39b6760576f01c"
"Show me the full contents of this submission"
"Check which page this submission came from"
"What billing and shipping details were captured on this form?"
This tool is read-only. You cannot edit or delete submissions through MCP. For modification requests, show what was submitted and explain that submission management must happen in the Checkout Page dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| submissionId | Yes | The ID of the submission to retrieve. Use `list_submissions` first if you need to discover a submission ID by email, name, page, customer, or date range. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint, but the description adds behavior the annotations cannot: no pagination on the response, a specific 404 'Submission not found' failure mode, and the livemode toggle for test-mode records. The read-only constraint is restated with an actionable fallback for write requests, which is genuinely useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then layered with usage, error behavior, examples, and the read-only caveat. Well-structured, though the four example queries and the bolded read-only paragraph push it slightly beyond the minimum an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-record getter with an output schema, an agent needs purpose, discovery path, test-mode handling, and failure semantics — all present. Return-value structure is properly delegated to the output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, making 3 the baseline. The description adds modest value by restating the livemode test-mode behavior and by tying the ID parameter to the discovery workflow, but it introduces no format or syntax detail the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Retrieve a single form submission by ID from your Checkout Page account' — and immediately establishes scope (one record, by ID, no pagination). It is clearly distinguishable from the sibling `list_submissions`, which it names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent exactly when to use this versus the alternative: 'Use `list_submissions` first if you need to discover a submission ID by customer email, customer name, page, customer ID, or date range.' It also routes modification intents away from MCP toward the dashboard, so both the when and the when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subscriptionARead-onlyInspect
Retrieve a single subscription by ID from your Checkout Page account. Pass livemode: false to read test-mode records.
Use list_subscriptions first if you need to discover a subscription ID by customer email, customer name, product title, or order ID.
If the subscription ID does not exist for the authenticated seller, returns a 404 error: "Subscription not found".
Example uses:
"Fetch subscription 6812fe6e9f39b6760576f01c"
"Show me the full state of this subscription"
"What's the current period end on this subscription?"
This tool is read-only. Cancellation and refund operations must be performed in the Checkout Page dashboard. For cancellation context, use prepare_subscription_cancellation to see eligibility, side effects, and a dashboard link.
| Name | Required | Description | Default |
|---|---|---|---|
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| subscriptionId | Yes | The ID of the subscription to retrieve. Use `list_subscriptions` first if you need to discover the subscription ID by email, name, customer, page, or date range. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, but the description adds real value: the 404 error behavior for unknown IDs, the livemode test-vs-live distinction, and the explicit statement that cancellation/refunds must happen elsewhere. It stops short of describing pagination or caching, though neither is relevant for a by-ID fetch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by routing guidance, error semantics and examples. The four example utterances are slightly more than needed but each illustrates a distinct use, so the cost is low.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only lookup with an output schema needs little beyond routing and error behavior, both of which are present. An agent has everything required to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description's 'Pass livemode: false to read test-mode records' largely repeats the schema text, though the example uses add mild illustrative value. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Retrieve a single subscription by ID from your Checkout Page account.' The singular 'single' paired with the ID requirement clearly distinguishes it from list_subscriptions and get_subscription_payment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use list_subscriptions to discover an ID, use prepare_subscription_cancellation for cancellation context, and perform cancellation/refunds in the dashboard. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subscription_paymentARead-onlyInspect
Retrieve a single subscription payment by ID — one charge within a subscription's billing cycle, not the subscription itself.
Pass livemode: false to read test-mode records.
Use list_subscription_payments first if you need to discover an ID; filter it by subscriptionId to see every payment on one subscription. For the subscription record itself (status, schedule, next billing date), use get_subscription.
If the ID does not exist for the authenticated seller, returns a 404 error: "Subscription payment not found".
Two independent status fields: paymentStatus is the charge outcome (succeeded, pending, failed, incomplete); invoiceStatus is the Stripe invoice lifecycle (draft, open, paid, uncollectible, void). Check both when answering "did this payment go through?".
Example uses:
"Why did the March payment on this subscription fail?"
"Was this renewal charge refunded?"
"Show me the invoice PDF for this subscription payment"
This tool is read-only. Refunds must be performed in the Checkout Page dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| subscriptionPaymentId | Yes | The ID of the subscription payment to retrieve. Use `list_subscription_payments` first if you need to discover the ID — filter by `subscriptionId` to see every payment on one subscription. This is the ID of a single payment, not the subscription it belongs to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description isn't carrying the safety burden — yet it still adds real behavior: a 404 with the exact message when the ID doesn't exist for the authenticated seller, test-mode access via livemode:false, and the constraint that refunds cannot be done here (dashboard only). It doesn't discuss rate limits or auth requirements beyond the seller scoping, keeping it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope, then grouped under clear bold headers for error behavior, status fields, and examples. It is on the long side and the three example utterances plus the restated read-only line are marginal, but nearly every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, yet the description still flags the two independent status fields (paymentStatus vs. invoiceStatus) and that both must be checked when answering 'did this payment go through?' — exactly the kind of domain trap an agent would otherwise get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including the exact livemode test-mode semantics and the 'not the subscription it belongs to' warning on subscriptionPaymentId. The description largely repeats this, so the baseline 3 applies; it adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a single subscription payment by ID') and immediately carves out scope: 'one charge within a subscription's billing cycle, not the subscription itself.' An agent can distinguish it from get_subscription and get_payment without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to alternatives by name and condition: use `list_subscription_payments` first to discover an ID (filtered by `subscriptionId`), and use `get_subscription` for subscription-level status/schedule/next-billing-date. Both the when-to-use and the when-not-to-use cases are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_themeBRead-onlyInspect
Fetch one theme by id with its design settings (variables). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| themeId | Yes | The theme ID, as returned by list or create. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, and the description's 'Read-only' merely restates that. It does add that the returned theme includes its design settings via `variables`, but says nothing about auth needs, error behavior, or whether a missing id returns empty vs. an error.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, resource and payload front-loaded, no filler. Minor waste in the trailing 'Read-only.' which duplicates the readOnlyHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read tool with an output schema, the description covers what an agent needs to invoke it: what is fetched and what it contains. The absence of sibling differentiation and error/id-origin context keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100% (themeId documented in the schema, including the 24-hex-char pattern and origin 'as returned by list or create'). The description adds no meaning beyond the schema, so the baseline 3 for schema-carried params is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (one theme by id) and names the key payload field (`variables` = design settings). It implicitly separates itself from list_themes and list_theme_properties, but never explicitly contrasts with those siblings, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: nothing tells the agent to prefer this over list_themes or list_theme_properties, nor that a theme id must come from list_themes/create_theme (that hint lives in the schema, not the description). Usage is only inferable from the phrase 'by id'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhookARead-onlyInspect
Fetch one webhook by id - its URL, subscribed events, status and delivery counters. The signing secret is never returned and custom header values are shown as [hidden]; headers are viewed and edited at the returned dashboardUrl. Use list_webhooks to find the id. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| webhookId | Yes | The webhook ID, as returned by create or list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation by disclosing the redaction contract: the signing secret is never returned, custom header values appear as `[hidden]`, and headers must be managed via the returned dashboardUrl. This is exactly the behavioral context an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is returned, then the redaction behavior, then the prerequisite and safety note. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no elaboration, yet the description still covers the non-obvious output aspects (redaction, dashboardUrl) and the id prerequisite. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single webhookId parameter is fully documented with its pattern and origin. The description adds no format or syntax detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Fetch one webhook by id') with the returned fields enumerated (URL, subscribed events, status, delivery counters). It is clearly distinguishable from the sibling list_webhooks and from create/update/delete_webhook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to list_webhooks to obtain the id, and states the operation is read-only. It gives clear context but does not state any condition under which this tool should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bookingsARead-onlyInspect
Retrieve a paginated list of event bookings processed through your Checkout Page account. Pass livemode: false to read test-mode records.
For questions about a customer's full purchase history query the other transaction tools.
Example customer support uses:
"Customer wants to know if they're registered - email is X" →
searchby email. CheckstatusandorderStatusand present the full picture: a refunded or canceled booking may still appear. Do not useamountPaid > 0as the test for registration - a complimentary booking is registered withamountPaidof 0. Let the merchant interpret whether the registration is still valid."Customer asking how much they paid — order 12345" →
orderIdlookup, reportamountPaidin display currency. IfamountRefunded > 0, also report the refund amount and net."Customer asking about a coupon — order 12345" →
orderIdlookup, checkcouponobject and report the coupon details (code, label, discount amount)."Customer chasing a refund — order 12345" →
orderIdlookup, checkstatusforrefundedorpartial_refund. ReportamountRefunded,lastRefundAt,lastRefundReason, andlastRefundReasonNote. If no refund has been issued, report that and direct to the dashboard."Customer says booking keeps failing" →
searchby email, look forstatus: failed/isAbandoned: truerecords alongside any successful booking.
Example uses:
"Show me recent bookings" → no filters, or narrow with
createdAfter"Show me canceled bookings" → filter by
orderStatus: 'canceled'"Find the booking for order 12345" → filter by
orderId"Show me abandoned event bookings" → filter by
abandonmentStatus: 'abandoned'"Show me complimentary bookings" → filter by
isComplimentary: 'true'
Money amounts: All monetary amounts are returned in the smallest currency unit (for example, 10661 USD = $106.61, 299 EUR = €2.99, 500 JPY = ¥500). Divide by 100 before displaying amounts to merchants or customers, noting that some currencies such as JPY do not use decimal minor units.
Two independent status fields:
statusis the payment status (paid, refunded, failed, etc.). Use for financial questions.orderStatusis the booking lifecycle (active, canceled, archived). Whether a booking is canceled depends onorderStatus, notstatus.These are independent: a booking can be
status: paid+orderStatus: canceled(paid then canceled, refund may not yet be issued), orstatus: refunded+orderStatus: active(refunded but booking not marked canceled).Questions about "canceled" bookings sometimes mean financially refunded (
status: refunded) rather than lifecycle-canceled (orderStatus: canceled). If the question is ambiguous, check both and explain what you find.isComplimentaryis independent of both: a complimentary booking was issued by the merchant at no charge and is recorded asstatus: paidwithamountandamountPaidof 0, whilecomplimentaryDiscountAmountholds the face value forgone. It is a real, valid registration, not an unpaid or failed one. Filter withisComplimentary: 'true'for comps only,'false'to exclude them.
Customer name fields. There are four places a name can appear: (1) customerName — the canonical customer name from the customer entity. This is the primary name field. (2) billing.name — from the payment card, may differ from the registration form name. (3) shipping.name — from the shipping details, when provided. (4) fields array — the name entered on the registration form. These may not all match — e.g. a spouse's card used for someone else's registration. For questions about a name on a booking, customerName is the best default; check the other three if there's a discrepancy.
Date filters: Always use UTC timestamps with the Z suffix (e.g. 2026-03-01T00:00:00Z). Never use local timezone offsets — dates are stored and compared in UTC.
Limit and large response handling:
Use the right limit for the task:
Single-record lookups (order lookup, registration check, customer search): use
limit: 10or less.
Bookings are returned sorted newest-first. Use cursor-based pagination (starting_after / ending_before) to page through large result sets. starting_after and ending_before cannot be used simultaneously. Max limit is 100, default is 10.
Data limitations for common support questions:
Event metadata: Booking records include
eventTitle(human-friendly event name) but do not include the event date, time, location, or description. Event details beyond the name aren't available through this tool — check the event in the Checkout Page dashboard.Refund details:
amountRefunded,lastRefundAt,lastRefundReason, andlastRefundReasonNoteare available on refunded/partial_refund records. Limitation:lastRefundReasonandlastRefundReasonNoteonly reflect the most recent refund action — if multiple partial refunds were issued with different reasons, only the latest is visible. Full refund history (individual refund transactions) requires the Checkout Page dashboard.Historical refund limitation: for records created before
2026-01-22T06:43:28.000Z, some refund metadata may be incomplete. A record can showstatus: refunded,partial_refund, or sometimescanceledwhileamountRefundedremains0or refund detail fields are missing. When reviewing older records, treat the refund status as authoritative but only quote an exact refunded amount if the record explicitly includes it.Cancellation metadata:
canceledByandcanceledReasonare only set when a cancellation is performed from the Checkout Page dashboard. For cancellations from other flows, these fields may be empty or null, so cancellation reason analysis is often unavailable.Email delivery: No tool in the MCP exposes email delivery information — no sent date, no delivery status, no bounce info. A booking can be confirmed (via this tool) but email delivery status cannot be checked. If a customer says they didn't receive a confirmation, verify the email address on file (
customerEmail,billing.email) is correct, confirm the booking exists, and direct to the Checkout Page dashboard where emails can be resent.Address information:
billing.addressandshipping.addressare often empty objects, especially for free or low-cost event registrations.Ticket capacity/inventory: The
capacityandticketGroupCapacityfields on ticket objects are historical snapshots from booking time — they do NOT reflect current remaining availability. If a ticket object'scapacityfield is missing, that ticket type should be treated as unlimited. IfticketGroupCapacityis missing, that ticket group should be treated as unlimited. But an unlimited ticket type can still belong to a ticket group with a limit, and an unlimited ticket group can still sit inside an event with a limit. Total event capacity lives on the event, which is not accessible through any current tool. Do not use booking records alone for inventory calculations. "How many tickets are left?", "Is my event sold out?", and "Can I accept more bookings?" are still unanswerable from this tool alone — you can count tickets sold, but you may not have the governing event or group limit to subtract from. For sold counts, note the inventory logic: canceled bookings release tickets back to inventory, but refunded bookings do not — a refunded ticket still counts against capacity.
Cross-tool routing:
Records do NOT overlap between tools — a transaction only appears in one tool. Payments, bookings, and subscriptions are separate record sets. There is no risk of double-counting when combining results across tools.
Name and event search: search on this tool matches customerName, customerEmail, eventTitle, and orderId. Searching by name (e.g. search: "Nelson") returns all records for customers with that name. Searching by event (e.g. search: "AI Summit") returns all bookings for that event. If you need more customer profile details (company, phone, tax ID), use list_customers or get_customer.
Order lookup: If "look up order 12345" returns 0 results here, try list_payments(orderId: "12345") and list_subscriptions(orderId: "12345") — the order may be a payment or subscription, not a booking.
Full customer history: For "show me everything this customer has bought," query all three transaction tools (list_payments, list_bookings, list_subscriptions) with the same customerId or search email and combine results. Do not present results from one tool alone as a complete history.
Customer profile: For profile data (company, phone, billing email, tax ID), use list_customers or get_customer — booking records only have customerEmail and billing.name.
This tool is read-only. You cannot transfer tickets, change attendee names, cancel bookings, resend confirmations, or issue refunds. For modification requests, show what's currently on file and explain that changes need to be made in the Checkout Page dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| pageId | No | Filter by event ID. | |
| search | No | Search by customerEmail, customerName, eventTitle, or orderId. Contains match (e.g. 'jane' matches 'jane@example.com', 'Doe' matches 'Jane Doe', 'Summit' matches 'Future of AI Summit 2026'). | |
| status | No | Filter by payment status. Valid values: created, pending, unpaid, partially_paid, paid, canceled, failed, partial_refund, refunded, draft, draft_expired. | |
| orderId | No | Filter by order ID. | |
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| couponCode | No | Filter by coupon code. | |
| customerId | No | Filter by customer ID. | |
| orderStatus | No | Filter by order status. Valid values: archived, active, canceled. | |
| createdAfter | No | Filter by lower bound of createdAt. | |
| createdBefore | No | Filter by upper bound of createdAt. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. | |
| isComplimentary | No | Filter by complimentary bookings. `true` returns only complimentary bookings, `false` excludes them. | |
| abandonmentStatus | No | Filter by `abandoned` or `recovered` bookings. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/non-destructive, and the description richly extends them: the tool cannot transfer tickets, cancel, or refund; refund metadata limitations; a historical cutoff after which refund data may be incomplete; instrument-capacity snapshots that do not reflect live inventory; and explicit 'unanswerable from this tool' surfaces. This is well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and organized under bold section headers, with each block (money units, status fields, name fields, dates, limits, limitations, routing) earning its place. It is nonetheless very long, and the support examples repeat the 'orderId lookup' pattern several times, so it is not fully free of redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter filtered list tool this is thorough: it covers money units, dual status semantics, name field precedence, pagination limits, known data gaps, and cross-tool routing. Nothing an agent needs to call it correctly or interpret the response is missing, even though an output schema already exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real semantic value the schema lacks: the independence of status vs orderStatus (with worked combined-state examples), the meaning of isComplimentary vs amountPaid=0, UTC-only date filter rules, and task-appropriate limit guidance. This materially reduces misuse of the filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Retrieve a paginated list of event bookings processed through your Checkout Page account.' It immediately distinguishes itself from list_payments and list_subscriptions by naming those siblings in the cross-tool routing section ('Payments, bookings, and subscriptions are separate record sets').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance via concrete support scenarios (registration check, order lookup, refund chase, failed booking) and explicit routing alternatives: try list_payments/list_subscriptions when an order lookup here returns 0 results, list_customers/get_customer for profile data, and all three for full history. Exclusions are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_checkout_pagesARead-onlyInspect
List the checkout pages on the Checkout Page account, newest first, each with its full configuration, product and fields. Archived pages are left out unless you filter by status. Read-only; this is how to find a page id for get_checkout_page and update_checkout_page. Forms and events are separate page types: use list_forms and list_events.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| search | No | Case-insensitive contains match against the page's internal name, title and product title. Searching 'course' matches a page named 'Premium course' and a page whose product is titled 'Video course'. There is no filter by product type, price or slug: page through and inspect those fields instead. | |
| status | No | Filter by publication status: `published`, `draft` or `archived`. Only one status per call. Without it, published and draft pages are returned and archived pages are excluded, so pass `archived` explicitly to see archived pages. | |
| testmode | No | Set to true to return only pages in test mode, or false for only pages not in test mode. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds useful behavioral details beyond annotations: archived pages are excluded by default, results are newest-first, full configuration/product/fields are returned, and forms/events are separate. It does not mention pagination or rate limits, but with annotations carrying the safety profile this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and resource, then scoping, defaults, and sibling routing. Four sentences, each carrying distinct operational value, with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with a rich input schema and an output schema, the description covers the key agent needs: what is listed, ordering, default filtering, safety profile, and how to route to sibling tools for IDs or other page types. Return-value details are appropriately left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, search, status, testmode, ending_before and starting_after in detail. The description adds only one parameter-related semantic: archived pages are left out unless you filter by status. That is helpful but does not materially extend the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the checkout pages'), the scope ('on the Checkout Page account'), ordering ('newest first'), and returned fields ('full configuration, product and fields'). It also distinguishes itself from get_checkout_page/update_checkout_page and from list_forms/list_events, so an agent can select it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says how to find a page id for get_checkout_page and update_checkout_page, clarifies that forms and events are separate page types served by list_forms and list_events, and explains the archived-pages default unless status is filtered. When-to-use and alternatives are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_couponsARead-onlyInspect
Retrieve a paginated list of discount coupons on your Checkout Page account. This is the only way to discover a coupon ID — take the id from here to use update_coupon.
search is a case-insensitive contains match on the coupon's label and code, so it answers "is there already a coupon for X?" before you create a duplicate with create_coupon.
Reading a coupon: the discount is either percentOff (a percentage) or amountOff (a flat amount in the smallest currency unit, paired with currency) — never both. duration is once, repeating (for durationInMonths), or forever. timesRedeemed counts redemptions so far, against maxRedemptions when one is set.
Whether a coupon actually works right now depends on several fields together, and there is no single "active" flag: deleted: true means soft deleted and dead; redeemBy in the past means expired; timesRedeemed >= maxRedemptions means exhausted. Check all three before telling a merchant a coupon is live. Soft-deleted coupons are returned by this tool — they are not filtered out.
Scoping: pageIds limits the coupon to specific pages and ticketTypeIds to specific ticket types. Empty or absent means the coupon is valid everywhere. These are IDs only — this tool does not resolve them to page or event names.
No filters beyond search. There is no way to filter by deleted, expiry, redemption count, or scope server-side. Page through and inspect those fields.
Coupons are returned sorted newest-first. Use cursor-based pagination (starting_after / ending_before) to page through large result sets. starting_after and ending_before cannot be used simultaneously. Max limit is 100, default is 10.
This tool is read-only. Use create_coupon to add one and update_coupon to change or soft delete one. A coupon's discount (code, amountOff, percentOff, currency, duration) can never be changed after creation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| search | No | Case-insensitive contains match against the coupon's label and code. Searching '10off' matches the code `10OFF`; searching 'summer' matches the label 'Summer sale'. There is no filter for redemption count, expiry, or deleted status — page through and inspect those fields instead. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation: soft-deleted coupons are returned and not filtered out, there is no single 'active' flag (deleted/redeemBy/timesRedeemed+maxRedemptions must be checked together), sorting is newest-first, pageIds/ticketTypeIds are IDs not resolved names, and discount fields are immutable after creation. This is exactly the operating context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Bold mini-headers (Reading a coupon, Scoping, No filters, etc.) keep a long description scannable, and the most important constraint (only ID-discovery path) is front-loaded. Some pagination and limit details are restated from the schema, which is the only minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return mechanics need not be explained, yet the description still decodes coupon field semantics (percentOff vs amountOff+currency, duration variants, redemption counters) and liveness rules — everything an agent needs to interpret results and act correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, search, starting_after, and ending_before are already fully documented in the schema, including the max-100/default-10 and mutual-exclusion rules the description repeats. The description adds only a small increment: framing search as a duplicate-check and reiterating the lack of other filters. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Retrieve a paginated list of discount coupons on your Checkout Page account') and immediately distinguishes itself from siblings by noting it is 'the only way to discover a coupon ID' and naming create_coupon/update_coupon as the alternatives. An agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: it is the sole ID-discovery path, it feeds update_coupon, and its search answers 'is there already a coupon for X?' before calling create_coupon. It also states when-not: no server-side filtering by deleted/expiry/redemption/scope, so page through instead. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_customersARead-onlyInspect
Retrieve a paginated list of customers from your Checkout Page account. Customer records are identity and profile data only — no purchase history, no transaction amounts, no subscription status.
Use this tool when you need profile data (company, phone, address, tax ID) or when you need a customer ID for filtering. The two-step pattern (search here → take id → filter transaction tools with customerId) is useful when:
You need to fan out across transaction tools with one consistent ID
The customer has multiple email addresses (searching by
customerIdcatches all transactions regardless of email)You need profile fields that don't exist on transaction records
The top-level address field is the billing address. The shipping.address field is the shipping address. These are separate and often don't match — a customer may have a billing address but no shipping address, or vice versa. When the question doesn't specify which address, present both clearly labelled (e.g. "Billing address: … / Shipping address: …"). Don't return only one when both exist, and don't return the billing address in response to a shipping address question.
For modification requests, show what's currently stored, then use update_customer with the customer's id once the merchant confirms the change. Data deletion and GDPR/privacy requests require human intervention in the dashboard.
No email delivery data in this tool. No tool in the MCP exposes email delivery information — not on customer records, not on payments, bookings, or subscriptions. You can confirm a purchase exists (via transaction tools) but cannot check email delivery status through this tool. Emails can be resent and email delivery can be verified in the Checkout Page dashboard.
What this tool cannot do:
No purchase history — customer records contain no transaction data. To see what a customer bought, use their
idascustomerIdon the transaction tools (see cross-tool routing below).No aggregation — cannot count customers by country, company, etc. server-side.
companyNameis not searchable —search: "Acme Corp"returns 0 even if a customer has thatcompanyName. To find customers by company, you must paginate and inspect records.
Date filters: Always use UTC timestamps with the Z suffix (e.g. 2026-03-01T00:00:00Z). Never use local timezone offsets — dates are stored and compared in UTC.
Customers are returned sorted newest-first. Use cursor-based pagination (starting_after / ending_before) to page through large result sets. starting_after and ending_before cannot be used simultaneously. Max limit is 100, default is 10.
Cross-tool routing:
Customer records do NOT contain purchase data. To build a complete customer picture, combine this tool with the transaction tools:
list_payments(customerId: "...")— one-time purchases, digital products, physical goods, invoices.list_bookings(customerId: "...")— event tickets and registrations.list_subscriptions(customerId: "...")— recurring billing, active and canceled subscriptions.
Records do not overlap between transaction tools — a transaction only appears in one tool. No risk of double-counting when combining results.
If a merchant gives you an order number rather than a customer name or email, do NOT use this tool — try the transaction tools with the orderId filter directly.
Example uses:
"How many customers do I have?" → call with
limit: 1, readtotal"How many new customers this month?" → use
createdAfterwith the first of the month,limit: 1, readtotal"Find customer jane@example.com" → use
search"Show me customers named Sarah" → use
search(matches name field). Verify the returned records match on name, not just email."What has John Smith ordered?" → search here by name, get
id, then query transaction tools withcustomerId"Find my customer Acme Corp" →
searchwon't match companyName; paginate and inspectcompanyNamefield
Example customer support uses:
"Customer asking what information is stored about them — email is jane@example.com" →
searchto find the customer record. Return all stored profile fields (name, email, phone, addresses, company, tax ID). Note: customer records only contain profile data — for a complete picture of what's stored, also query the transaction tools (list_payments,list_bookings,list_subscriptions) with thecustomerIdto show their purchase history."Customer wants to update their email address" → look up the customer to confirm current email, then call
update_customerwith theiridand the new email once the merchant confirms it. The customer can also change their own email through the customer portal."Customer says they didn't get their confirmation email" → find customer, then check transaction tools for recent purchases. Confirm the purchase exists but explain that email delivery status cannot be checked through this tool. Email delivery can be verified and emails can be resent from the Checkout Page dashboard.
"Customer wants a full history of what they've bought" → find customer by email/name, then query all transaction tools with
customerIdto compile full purchase history."Customer requesting deletion of their personal data" → GDPR/privacy request. Show what's stored and explain that data deletion requires human intervention in the Checkout Page dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| search | No | Search by email or name. Contains match. | |
| createdAfter | No | Filter by lower bound of createdAt. | |
| createdBefore | No | Filter by upper bound of createdAt. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/destructive/openWorld, so the bar is lower, yet the description adds substantially more: newest-first ordering, cursor pagination semantics with mutual exclusivity, no server-side aggregation, companyName not being searchable, UTC-only date handling, and human intervention for GDPR/deletion. This is rich behavioral context beyond the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded well and broken into labelled sections, but it is substantially padded: the email-delivery disclaimer is repeated three times, GDPR/human-intervention twice, and the 'customer records contain no purchase data' point recurs throughout. The two example blocks partially duplicate the routing section already stated above them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and everything else an agent needs is present: routing to sibling tools, pagination behavior, search limitations, date format, and escalation paths for deletion requests. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents limit bounds, cursor exclusivity, and the Z-suffixed date pattern. The description still adds value the schema doesn't carry — the hard rule that dates must be UTC with Z and never local offsets, and the caveat that `search` matches name/email but will return 0 for companyName.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope ('paginated list of customers') and immediately delimits what a customer record is NOT (no purchase history, no transaction amounts, no subscription status). This cleanly separates it from get_customer and from the transaction list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (profile data, obtaining an id for filtering), when-not-to-use (order number given → go to transaction tools), and a named cross-tool routing block pointing at list_payments/list_bookings/list_subscriptions. The two-step search→id→filter pattern is spelled out with the conditions that motivate it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsARead-onlyInspect
List the event pages on the Checkout Page account, newest first, each with its full configuration, event details, ticket groups, ticket types and fields. Archived events are left out unless you filter by status. Read-only; this is how to find an event id for get_event, update_event, list_bookings and list_tickets. Checkout pages and forms are separate page types: use list_checkout_pages and list_forms.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| search | No | Case-insensitive contains match against the event's internal name and title. Searching 'gala' matches an event titled 'Summer gala'. There is no filter by event date, venue or ticket type: page through and inspect `eventDetails` and `ticketGroups` instead. | |
| status | No | Filter by publication status: `published`, `draft` or `archived`. Only one status per call. Without it, published and draft pages are returned and archived pages are excluded, so pass `archived` explicitly to see archived pages. | |
| testmode | No | Set to true to return only pages in test mode, or false for only pages not in test mode. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: newest-first ordering, the fact that archived events are excluded by default, and that each record carries nested configuration (ticketGroups, ticketTypes, fields). It stops short of saying anything about result caps or cursor mechanics for the list as a whole.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the verb, resource and ordering before the routing guidance. No filler and no repetition of schema-level parameter documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and the description still summarizes what each record contains. Combined with complete schema coverage and explicit sibling routing, an agent has everything needed to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with limit, search, status, testmode and both cursors fully documented in the schema itself. The description's only added parameter-relevant content is the archived-by-default behavior, which the status schema description already states verbatim. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the event pages on the Checkout Page account') plus scope details (newest first, full configuration including ticket groups/types/fields). It explicitly disambiguates from the similarly-named siblings by noting that checkout pages and forms are separate page types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the downstream use case clearly: 'this is how to find an event id for get_event, update_event, list_bookings and list_tickets'. It also names the two alternative tools for other page types and explains the archived-status default, so when-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_formsARead-onlyInspect
List the form pages on the Checkout Page account, newest first, each with its full configuration, fields and files. Archived forms are left out unless you filter by status. Read-only; this is how to find a form id for get_form, update_form and list_submissions. Checkout pages and events are separate page types: use list_checkout_pages and list_events.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| search | No | Case-insensitive contains match against the form's internal name and title. Searching 'waitlist' matches a form titled 'Join the waitlist'. There is no filter by field, file or slug: page through and inspect those fields instead. | |
| status | No | Filter by publication status: `published`, `draft` or `archived`. Only one status per call. Without it, published and draft pages are returned and archived pages are excluded, so pass `archived` explicitly to see archived pages. | |
| testmode | No | Set to true to return only pages in test mode, or false for only pages not in test mode. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, and the description reinforces read-only. It adds genuinely useful behavior beyond annotations: newest-first ordering, inclusion of full configuration/fields/files, and that archived forms are silently excluded unless explicitly requested.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what is returned, followed by the archived caveat, the ID-discovery purpose, and the sibling disambiguation. Every sentence carries actionable information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value documentation is unnecessary, and the description still covers payload contents, ordering, default filtering, the primary downstream use (finding a form id) and sibling routing. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already documents limit, search, status, testmode and both cursors in detail, so the baseline is 3. The description's param-relevant claims (archived default exclusion, no field/file/slug filtering) largely restate what the schema already says, adding little beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the form pages on the Checkout Page account') and even describes the payload shape ('full configuration, fields and files') and ordering ('newest first'). It explicitly distinguishes itself from sibling page types by naming list_checkout_pages and list_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: 'this is how to find a form id for get_form, update_form and list_submissions', plus clear when-not guidance ('Checkout pages and events are separate page types: use list_checkout_pages and list_events'). The archived-default behavior tells the agent when it must pass a status filter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesARead-onlyInspect
List invoices generated from payments (Charges) on the Checkout Page account. Pass livemode: false to read test-mode records. Each invoice's invoiceUrl links to its hosted PDF, the document customers usually ask for. The link is signed, safe to share with the buyer, and expires 1 hour after the response. Read-only; for full purchase history also query list_payments, list_subscriptions, list_subscription_payments and list_bookings.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| search | No | Case-insensitive search matched against `customerEmail`, `customerName`, `productTitle` and `invoiceNumber`. The query is routed based on input shape: email-like inputs (`jane@example.com`) match `customerEmail` only; identifier-like inputs containing a digit/underscore/hyphen (`2026-000010`) match `invoiceNumber`; multi-word inputs match `customerName` and `productTitle`; any other single bare word falls back to a broad case-insensitive substring match across `customerName`, `customerEmail` and `productTitle`. Best default when the user gives an ambiguous query. A customer may have multiple invoice records — always review all matches, not just the first. | |
| status | No | Filter by invoice status. Only one status per call. Valid values: draft, open, paid, uncollectible, refunded, partially_refunded, void. Use "paid" for completed invoices, "open" for outstanding, "refunded" or "partially_refunded" for refund history, "void" for cancelled. Filter by status when counting a category — an unfiltered total includes drafts and voids. | |
| chargeId | No | Return invoices for a specific payment (Charge). Use when a customer asks for a copy of their invoice and you already have the originating payment ID. Most charges have one invoice. | |
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| poNumber | No | Exact match on the invoice PO number. Use for "find the invoice for PO-5678". | |
| customerId | No | Return all invoices for a specific customer. Useful when you already have the customer record (e.g. from get_customer or list_customers). | |
| createdAfter | No | Inclusive lower bound on invoice createdAt. ISO-8601 UTC datetime with the `Z` suffix (e.g. `2026-01-01T00:00:00Z`). Never use a local timezone offset — invoices are stored and compared in UTC. | |
| createdBefore | No | Inclusive upper bound on invoice createdAt. ISO-8601 UTC datetime with the `Z` suffix (e.g. `2026-12-31T23:59:59Z`). Never use a local timezone offset — invoices are stored and compared in UTC. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), but the description adds genuinely new behavior: the invoiceUrl is a signed, shareable link that expires 1 hour after the response, and it reiterates the read-only nature. That expiry/shareability detail is not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose and scope, followed by the livemode hint, the invoiceUrl caveat, and sibling routing. Every sentence carries information, though it is slightly denser than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 optional parameters fully documented in the schema, an output schema present, and annotations covering safety, the description supplies the remaining operational context an agent needs: test-mode switching, link expiry, and where to look for broader purchase history. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including the search routing rules and UTC date-time constraints. The description only restates the livemode usage hint and references invoiceUrl (a response field, not a parameter), adding little beyond the structured data. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a precise verb and resource with scope: invoices generated from payments (Charges) on the Checkout Page account. It also names the sibling list tools that cover adjacent purchase-history data, so an agent can distinguish it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete routing guidance: use livemode:false for test-mode records, and query list_payments/list_subscriptions/list_subscription_payments/list_bookings for full purchase history. It stops short of an explicit 'when not to use this' (e.g., use get_invoice for a single known invoice), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_paymentsARead-onlyInspect
Retrieve a paginated list of payments processed through your Checkout Page account. Pass livemode: false to read test-mode records.
For questions about a customer's full purchase history query the other transaction tools.
Example customer support uses:
Customer asking about order status -
orderIdlookup, reportstatusand key details (product, amount, date)Customer unsure if payment went through -
searchby email, identify which records arepaidvsfailed.Customer says they were double-charged -
searchby email, compare all records. CheckstatusandamountPaidon each.Customer asking about a coupon -
orderIdlookup, checkcouponobject and report the coupon details (code, label, discount amount).Customer asking for a receipt -
orderIdlookup, confirm the order details (product, amount, date, payment method). AninvoiceIdon a paid record means an invoice was generated;get_invoicereturns it with a link to its PDF. Invoices can be resent from the Checkout Page dashboard.Customer asking about a refund -
orderIdlookup, checkstatus. Ifrefunded: confirm the full refund, reportamountRefundedas the refund amount,lastRefundAtas the refund date, andlastRefundReasonas the reason. Ifpartial_refund: reportamountRefundedvsamountPaidso the customer knows how much was refunded and how much they retain.lastRefundReasonNotemay contain a merchant-written explanation.Customer asking about a download or delivery -
orderIdlookup, confirm the purchase is paid. No download URL or delivery tracking is available on payment records. For digital products, downloads are accessed via the customer portal. The customer should check their purchase confirmation email first; if they can't find it, sharing a link to the customer portal will let them access their downloads.Customer says checkout keeps failing -
searchby email. Look for records with problem statuses:failed,draft,draft_expired,created,pending,unpaid, orcanceled. Adraftordraft_expiredrecord may mean the customer didn't complete the checkout form. CheckpaymentErroron failed records for a specific error message.Customer wants full purchase history - this tool only covers payments. Also query the other transaction tools with the same email/customerId to get the full picture. Combine results before presenting. Do not present results from
list_paymentsalone as a complete history.Order lookup returns 0 results - try
list_bookings(orderId: "...")andlist_subscriptions(orderId: "..."). The order may be a booking or subscription, not a payment. Always try all tools before reporting an order doesn't exist.
Example uses:
"Show me failed payments" - filter by
status: 'failed'"Show me payments for checkout page X" - filter by
pageId"Show me all payments from customer X" - filter by
searchwith their name or email"Find order ORD-9182" - filter by
orderId"Show me abandoned carts" - filter by
abandonmentStatus: 'abandoned'"Show me refunds" - filter by
status: 'refunded'(also checkstatus: 'partial_refund'separately - only one status per call).
Money amounts: All monetary amounts are returned in the smallest currency unit (for example, 10661 USD = $106.61, 299 EUR = €2.99, 500 JPY = ¥500). Divide by 100 before displaying amounts to merchants or customers, noting that some currencies such as JPY do not use decimal minor units.
Customer name fields. There are four places a name can appear: (1) customerName - the canonical customer name from the customer entity. This is the primary name field. (2) billing.name - from the payment card, may differ from the checkout form name. (3) shipping.name - from the shipping details, when provided. (4) fields array - the name entered on the checkout form. These may not all match - e.g. a spouse's card used for someone else's order. For questions about a name on an order, customerName is the best default; check the other three if there's a discrepancy.
Data limitations for common support questions:
Receipt/invoice requests:
invoiceIdconfirms an invoice was generated.get_invoicereturns the invoice and a link to its PDF. Resending an invoice is only possible in the Checkout Page dashboard.Refund details:
amountRefunded,lastRefundAt,lastRefundReason, andlastRefundReasonNoteare available on refunded/partial_refund records. Limitation: these fields only reflect the most recent refund action - earlier reasons are overwritten. Full refund history requires the Checkout Page dashboard.Historical refund limitation: for records created before
2026-01-22T06:43:28.000Z, some refund metadata may be incomplete. A record can showstatus: refunded,partial_refund, or sometimescanceledwhileamountRefundedremains0or refund detail fields are missing. When reviewing older records, treat the refund status as authoritative but only quote an exact refunded amount if the record explicitly includes it.Cancellation metadata:
canceledByandcanceledReasonare only set when a cancellation is performed from the Checkout Page dashboard. For cancellations from other flows, these fields may be empty or null, so cancellation reason analysis is often unavailable.Email delivery: No tool in the MCP exposes email delivery information. A purchase can be confirmed (via this tool) but email delivery status cannot be checked through this tool. Email delivery can be verified and emails can be resent from the Checkout Page dashboard.
Download/delivery: No download URL, delivery status, or fulfilment tracking exists on payment records. For digital products, downloads are accessed via the customer portal.
Payment failure reasons:
paymentErrorprovides the last error message but is not guaranteed to be set.paymentErrorpersists even after a successful retry - always checkstatusfirst.Address information:
billing.addressandshipping.addressare often empty objects, especially for non-physical products.
Date filters: Always use UTC timestamps with the Z suffix (e.g. 2026-03-01T00:00:00Z). Never use local timezone offsets — dates are stored and compared in UTC.
Limit and large response handling:
Use the right limit for the task:
Single-record lookups (order lookup, customer search, "has X paid?"): use
limit: 10or less.
Tips for common questions:
For count questions ("how many paid orders?"), filter by the relevant status (e.g.
status: "paid") and readtotalfrom the response. An unfilteredtotalincludes all records regardless of status (failed, draft, etc.) - always filter when counting a specific category.For "who paid?" or "has X paid?", use
searchwith the customer's email and check thestatusfield.
Payments are returned sorted newest-first. Use cursor-based pagination (starting_after / ending_before) to page through large result sets. starting_after and ending_before cannot be used simultaneously. Max limit is 100, default is 10.
Cross-tool routing:
Records do NOT overlap between tools - a transaction only appears in one tool. Payments, bookings, and subscriptions are separate record sets. There is no risk of double-counting when combining results across tools.
Name search: search on this tool matches customerName, customer email, productTitle, and orderId. Searching by name (e.g. search: "Nelson") returns all records for customers with that name. If you need more customer profile details (company, phone, tax ID), use list_customers or get_customer.
Order lookup: If "look up order 12345" returns 0 results here, try list_bookings(orderId: "12345") and list_subscriptions(orderId: "12345") - the order may be a booking or subscription, not a payment.
Full customer history: For "show me everything this customer has bought," query all transaction tools with the same customerId or search email and combine results.
Customer profile: For profile data (company, phone, billing email, tax ID), use list_customers or get_customer - payment records have customerName, customerId, customerEmail, billing.name, and shipping.name but not the full profile fields.
This tool is read-only. You cannot process refunds, resend receipts, update customer details, change shipping addresses, or resend download links. For these actions, explain what's currently on file. The merchant can manage orders in the Checkout Page dashboard. The customer can access their purchases through the customer portal.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| pageId | No | Filter payments by page ID. | |
| search | No | Search payments by customerEmail, customerName, productTitle, or orderId. Contains match. | |
| status | No | Payment status filter. Valid values: created, pending, unpaid, partially_paid, paid, canceled, failed, partial_refund, refunded, draft, draft_expired. | |
| orderId | No | Filter by exact order ID. | |
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| productId | No | Filter payments by product ID. | |
| couponCode | No | Filter payments where a specific coupon code was used (e.g. 'SUMMER20'). | |
| customerId | No | Filter payments by customer ID. | |
| orderStatus | No | Order lifecycle status filter. Valid values: archived, active, canceled. | |
| createdAfter | No | Filter by lower bound of createdAt. | |
| createdBefore | No | Filter by upper bound of createdAt. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. | |
| abandonmentStatus | No | Filter by `abandoned` or `recovered` payments. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description goes well beyond them: money returned in smallest currency unit, refund metadata overwritten to only the latest action, the pre-2026-01-22 refund-metadata gap, paymentError persisting after a successful retry, and no email-delivery or download-URL visibility. These are non-obvious behavioral traits an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The high-value material is front-loaded, but the text is very long and repeats itself: order lookup fallback to list_bookings/list_subscriptions appears twice, full-customer-history guidance appears twice, and receipt/refund advice is duplicated across the scenario list and the data-limitations list. Useful, but several paragraphs do not earn their place a second time.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still covers the field semantics an agent must interpret (customerName vs billing.name vs shipping.name vs fields, invoiceId, refund fields). Given the 15-parameter surface and the operational limitations, this is complete enough to call the tool correctly and interpret results honestly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description genuinely adds meaning: UTC-only timestamps with a Z suffix, sorting (newest-first), pagination cursor semantics and the starting_after/ending_before mutual exclusion, plus guidance to read total for counts and to filter before counting. It stops short of documenting every filter's semantics, but adds real value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Retrieve a paginated list of payments') and immediately scopes it to the Checkout Page account. It explicitly distinguishes itself from sibling transaction tools ('For questions about a customer's full purchase history query the other transaction tools') and from get_payment, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance via worked support scenarios, names concrete alternatives (list_bookings, list_subscriptions, list_customers, get_customer, get_invoice), and states the key exclusion: it is read-only and cannot process refunds, resend receipts, or update details. The cross-tool routing section clarifies that records do not overlap between tools, removing ambiguity about double-counting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_submissionsARead-onlyInspect
Retrieve a paginated list of form submissions processed through your Checkout Page account. Pass livemode: false to read test-mode records.
This tool is useful for customer-support and operations questions about what a person submitted on a form, which page a submission came from, and when it was captured.
Example uses:
"Show me recent submissions"
"Find submissions from jane@example.com"
"Find submissions for customer 6812fe6e9f39b6760576f01c"
"Show submissions for form X"
"Show submissions for the Lead Capture Form"
"Show failed submissions"
"How many submissions did I get this week?" — apply a date range and read
total
Example support uses:
Customer says they filled in a form but is unsure it went through — search by email and check whether a matching submission exists and whether
statusissucceededorfailed.Merchant wants all submissions for a specific person — use
searchwith email or name, orcustomerIdwhen known.Merchant wants submissions from a specific form — use
pageIdwhen you know the page ID, orsearchwith the form title.Merchant wants the full payload for one result — first call
list_submissions, then pass a returnedidintoget_submission.
Data limitations:
No tool in the MCP can edit or delete submissions.
Submission records show what was captured, but not downstream fulfillment or email delivery status.
Date filters: Always use UTC timestamps with the Z suffix (e.g. 2026-03-01T00:00:00Z). Never use local timezone offsets — dates are stored and compared in UTC.
Submissions are returned sorted newest-first. Use cursor-based pagination (starting_after / ending_before) to page through large result sets. starting_after and ending_before cannot be used simultaneously. Max limit is 100, default is 10.
This tool is read-only. You cannot modify or delete submissions through MCP. For those actions, explain what is on file and direct the merchant to the Checkout Page dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| pageId | No | Filter by the form page ID that received the submission. | |
| search | No | Search by `customerEmail`, `customerName`, and `formTitle`. Contains match (for example, 'jane' matches 'jane@example.com' and 'Jane Smith', while 'lead' matches 'Lead Capture Form'). | |
| status | No | Filter by submission status. Valid values: succeeded, failed. | |
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| customerId | No | Filter by the associated customer ID. | |
| createdAfter | No | Filter by lower bound of createdAt. Use a UTC ISO 8601 timestamp with a `Z` suffix. | |
| createdBefore | No | Filter by upper bound of createdAt. Use a UTC ISO 8601 timestamp with a `Z` suffix. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint/destructiveHint, but the description adds substantial context beyond them: no tool can edit/delete submissions, records omit downstream fulfillment and email-delivery status, results are newest-first, pagination cursors are mutually exclusive, limit caps at 100/default 10, and date filters must be UTC with Z.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then sections for examples, support uses, data limitations, dates, and pagination. Well organized and skimmable, though the read-only point is stated twice ('This tool is read-only' and 'You cannot modify or delete submissions') and the example list is long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be detailed, and the description still references relevant fields (`total`, `status`, `id`). For a 10-param read-only list tool, all decision-relevant context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine selection meaning beyond the schema: it explains when to prefer pageId vs search vs customerId, that a date range plus `total` answers count questions, and reiterates the UTC-only date constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Retrieve a paginated list of form submissions processed through your Checkout Page account.' It also distinguishes itself from the sibling get_submission by naming it for the single-record case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit routing guidance (use pageId when you know the page ID, search with the title otherwise; follow up with get_submission for full payload) plus concrete example queries and support scenarios. When-to-use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_subscription_paymentsARead-onlyInspect
Retrieve a paginated list of subscription payment records for your Checkout Page account. Each record represents one per-Stripe-invoice charge against a subscription — a billing cycle payment, renewal, or failed attempt. Subscriptions rarely accumulate more than 24–36 payment records (2–3 years of monthly billing), so limit: 100 typically retrieves the full history for a single subscription in one call.
Pass livemode: false to read test-mode records.
Cross-tool routing:
Per-payment subscription history → this tool (
list_subscription_payments)Parent subscription record (status, plan, trial, coupon) →
list_subscriptionsOne-time payment charges →
list_paymentsEvent/booking charges →
list_bookings
Records do NOT overlap between tools — a transaction only appears in one tool. No risk of double-counting when combining results.
This tool is read-only. You cannot process refunds, cancel subscriptions, update payment methods, or retry failed payments. For these actions, explain what is currently on file. The merchant can manage subscription payments in the Checkout Page dashboard. The customer can update their payment method through the customer portal.
| Name | Required | Description | Default |
|---|---|---|---|
| paid | No | Filter by whether the invoice was fully collected. `true` = invoice paid in full, `false` = unpaid (use for "show me unpaid invoices"). Convenience field — an invoice can be `paid: true` even after a failed attempt followed by a successful retry. | |
| limit | No | Number of records per page (integer, max 100, default 10). | |
| pageId | No | Filter subscription payments by page ID. | |
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| refunded | No | Filter by whether the payment was refunded. Combine with `createdAfter` to scope to a time window (e.g. "show me refunded subscription payments this month"). | |
| customerId | No | Filter subscription payments by customer ID. | |
| createdAfter | No | Filter by lower bound of `createdAt`. Use a UTC ISO 8601 timestamp with the `Z` suffix (e.g. `2026-03-01T00:00:00Z`). Never use local timezone offsets — dates are stored and compared in UTC. | |
| billingReason | No | Filter by reason the invoice was generated. Valid values: manual, subscription_create, subscription_cycle, subscription_threshold, subscription_update, upcoming. `subscription_create`: first payment when the subscription is created and activated; the customer's initial charge. `subscription_cycle`: standard renewal at the end of a billing period. `subscription_update`: charge from a plan change or proration; can explain an unexpected charge after switching plans. `subscription_threshold`: metered billing usage threshold trigger. `manual`: manually triggered by the merchant. `upcoming`: preview of an upcoming invoice; not yet charged. | |
| createdBefore | No | Filter by upper bound of `createdAt`. Use a UTC ISO 8601 timestamp with the `Z` suffix (e.g. `2026-03-31T23:59:59Z`). Never use local timezone offsets — dates are stored and compared in UTC. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| paymentStatus | No | Filter by status of the underlying Stripe charge or payment intent. Valid values: succeeded, pending, failed, incomplete. Use `failed` to find failed attempts (e.g. "show me failed subscription payments"). Note: a record can have `paymentStatus: 'failed'` while the invoice is still `open` — if a later retry succeeded, both `paymentStatus` and `paid` reflect success. For overall invoice lifecycle use the `invoiceStatus` field on the response; for a simple "was this paid?" check use `paid`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. | |
| subscriptionId | No | Filter by parent subscription ID. Use to retrieve the full per-cycle payment history for one subscription (e.g. "show me payments for subscription X" or "when was subscription X last charged?"). Results are newest-first by default, so the first record is the most recent payment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is pre-covered and the restated 'read-only' line is partly redundant. The description does add genuine context beyond annotations: the non-overlap guarantee that prevents double-counting, the scale heuristic (24-36 records, so limit 100 usually gets full history), and the test-mode livemode:false behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then routing, then constraints, with bullets doing real work. It is on the longer side and the closing read-only paragraph restates annotation-provided facts, but no sentence is filler and the routing table is dense with useful routing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. Between the record definition, routing, scale expectations, test-mode note, and read-only scope, an agent has everything needed to call this 13-parameter tool correctly without consulting other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 regardless. The description goes slightly beyond by giving the practical heuristic that limit: 100 retrieves the full per-subscription history and by calling out livemode: false for test mode, which helps an agent pick parameter values rather than just read their types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a paginated list of subscription payment records') and immediately defines what a record represents (one per-Stripe-invoice charge against a subscription). It explicitly differentiates from siblings by naming list_subscriptions, list_payments, and list_bookings and asserting the result sets do not overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit cross-tool routing block mapping four distinct intents to four tools, plus a when-not-to-use clause: it cannot refund, cancel, update payment methods, or retry payments, and it names the fallback (explain what is on file, dashboard, customer portal). Alternatives and exclusions are both given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_subscriptionsARead-onlyInspect
Retrieve a paginated list of subscriptions processed through your Checkout Page account. Pass livemode: false to read test-mode records.
For questions about a customer's full purchase history query the other transaction tools.
Example uses:
"Show me recent subscriptions" — use no filters or narrow with
createdAfter"Find the subscription for order ORD-9182" — filter by
orderId"Show me subscriptions for checkout page X" — filter by
pageId"Find subscriptions for jane@example.com" — use
search(contains match on email)"Find subscriptions for Jane Smith" — use
search: "Jane Smith"(matchescustomerName)"Show me Galactic Coffee subscriptions" — use
search: "Galactic Coffee"(matchesproductTitle)"How many active subscriptions do I have?" — filter by
status: "active", readtotal. Note: also querystatus: "past_due"separately — past_due subscriptions are still active but at risk (see status guidance below)."Show me canceled subscriptions" — filter by
status: "canceled""What's my MRR?" — Tell the merchant they can see their MRR in the Checkout Page dashboard.
"Show me abandoned subscription checkouts" — use
abandonmentStatus: "abandoned"
Money amounts: All monetary amounts are returned in the smallest currency unit (for example, 10661 USD = $106.61, 299 EUR = €2.99, 500 JPY = ¥500). Divide by 100 before displaying amounts to merchants or customers, noting that some currencies such as JPY do not use decimal minor units.
Example customer support uses:
Customer asking if their subscription is active —
searchby email ororderIdlookup. Checkstatus: ifactive, the subscription is healthy. Ifpast_due, the subscription is still active but the payment method is failing — tell the customer to update their payment method through the customer portal. Ifcanceled, report when it was canceled (canceledAt).Customer asking when their next payment is — check
currentPeriodEndfor the next billing date,amountfor the charge amount,intervalandintervalCountfor the billing frequency (e.g. interval: "year", intervalCount: 1 = annual billing). Note: if the subscription has a coupon, the actual charge may be less thanamount— checkcouponSnapshotfor discount details.Customer saying their payment keeps failing —
searchby email. Checkstatusforpast_dueorfailed. Check thepaymentErrorfield for a specific error message. Note: the troubleshooting depends on context — if this is the first payment to activate the subscription, the customer may need to retry with a different payment method. If it's a recurring payment failing, the customer should update their payment method through the customer portal. If the customer has multiple subscriptions, only some may be failing — distinguish them clearly.Customer wanting to cancel —
orderIdor email lookup, confirm what's on file (status, billing details, current period end). Subscription cancellation can be done by the merchant in the Checkout Page dashboard or by the customer through the customer portal.Customer claiming they cancelled but are still being charged - check
statusandcanceledAt. Ifstatus: "canceled"andcanceledAtis set, the subscription was indeed canceled on that date. ThecurrentPeriodEndmay still be in the future (the customer paid for the period). For the individual charges, uselist_subscription_payments(subscriptionId: ...).Customer asking for a refund on their subscription — confirm the subscription details (status, amount, how long active). If a refund has already been issued, report
lastRefundAt(date),lastRefundReason(reason code), andlastRefundReasonNote(merchant notes). Refunds can be processed by the merchant in the Checkout Page dashboard.Customer asking what plan they're on — check
productTitle(human-readable product name, e.g. "Galactic Coffee Subscription"),amount,interval, andintervalCount. If the subscription has a coupon, also report the discount. Present the plan name with amount and billing frequency (e.g. "Galactic Coffee Subscription — $100/month").Customer asking about their trial — check
trialStart,trialEnd, andstatus. IfstatusistrialingorscheduledandtrialEndis in the future, the trial is still active (trialing= free trial;scheduled= setup fee paid, billing starts later). IftrialEndis in the past, the trial has ended (billing should have started atstartDate).Customer asking about their total payments - this tool reports the current recurring charge (
amount), billing frequency (interval+intervalCount), and how long the subscription has been active (fromcreatedAt). For what was actually charged each cycle, uselist_subscription_payments(subscriptionId: ...)and add up the payments.Customer asking about a discount on their subscription — check
couponSnapshotfor the coupon code, label, and discount amount (amountOfforpercentOff). CheckcouponSnapshot.durationto see how long the discount lasts (forever,repeatingwithdurationInMonths, oronce). Setup fee discounts are visible insetupFeeDiscountAmount.Customer saying the name on their subscription is wrong — check
customerName,billing.name(from the payment card),shipping.name, and thefieldsarray forcustomer_name(from the checkout form). These often don't match. The merchant can update the name in the Checkout Page dashboard; the customer can update it through the portal.
Data limitations for common support questions:
Charge/payment history: For per-payment history of a subscription (when each charge happened, amount per cycle, refund details), use
list_subscription_payments(subscriptionId: ...).Refund details:
lastRefundAt,lastRefundReason,lastRefundReasonNoteavailable but only reflect the most recent refund. Per-refund history requires the dashboard.Historical refund limitation: for records created before
2026-04-09T08:47:59.000Z, full subscription refund transaction history may be incomplete. A subscription can still show refund-related fields or a refunded state while older refund history is incomplete or missing. When reviewing older subscription records, only quote exact refund timing or refund details when the record explicitly includes them.Email delivery: No email delivery data available through this tool. Email delivery can be verified and emails can be resent from the Checkout Page dashboard.
Access/entitlement: No content access or login status data.
Payment method updates: The merchant can update in the dashboard; the customer can update through the portal.
Cancellation metadata:
canceledAtpresent on canceled records.canceledByandreasonare optional.
Date filters: Always use UTC timestamps with the Z suffix (e.g. 2026-03-01T00:00:00Z). Never use local timezone offsets — dates are stored and compared in UTC.
Limit and large response handling:
Use the right limit for the task:
Single-record lookups (order lookup, customer search): use
limit: 10or less.
Tips for common questions:
For count questions, use the
statusfilter and readtotal. Remember:past_duesubscriptions are still active — include them in "active" counts.For single-customer lookups, use
searchwith email ororderId.A customer may have multiple subscription records (e.g. a failed attempt followed by a successful signup). Always check all returned records, not just the first one.
Subscriptions are returned sorted newest-first. Use cursor-based pagination (starting_after / ending_before) to page through large result sets. starting_after and ending_before cannot be used simultaneously. Max limit is 100, default is 10.
Cross-tool routing:
Records do NOT overlap between tools — a transaction only appears in one tool. Payments, bookings, and subscriptions are separate record sets. No risk of double-counting when combining results.
Order lookup: If "look up order 12345" returns 0 results here, try list_payments(orderId: "12345") and list_bookings(orderId: "12345").
Full customer history: For "show me everything this customer has bought," query list_payments and list_bookings tools with the same customerId or search email and combine results.
Customer profile: For profile data (company, phone, billing email, tax ID), use list_customers or get_customer — subscription records have customerName, customerId, customerEmail, billing.name, and shipping.name but not the full profile fields.
This tool is read-only. You cannot cancel subscriptions, process refunds, update payment methods, change billing details, pause/resume billing, or switch plans. For these actions, explain what's currently on file. The merchant can manage subscriptions in the Checkout Page dashboard by navigating to the subscription record. The customer can manage their subscription through the customer portal.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| pageId | No | Filter subscriptions by page ID. | |
| search | No | Search by customerEmail, customerName, productTitle, or orderId. Contains match. | |
| status | No | Filter by subscription lifecycle status. Valid values: draft, draft_expired, incomplete, incomplete_expired, trialing, paused, scheduled, active, past_due, canceled, unpaid, failed, completed. | |
| orderId | No | Filter by exact order ID. | |
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| customerId | No | Filter subscriptions by customer ID. | |
| createdAfter | No | Filter by lower bound of createdAt. | |
| createdBefore | No | Filter by upper bound of createdAt. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. | |
| abandonmentStatus | No | Filter by `abandoned` or `recovered` subscriptions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint/openWorldHint, and the description goes well beyond them: an explicit 'This tool is read-only' statement enumerating what cannot be done (cancel, refund, update payment method, pause/resume, switch plans), plus data-availability limits (no email delivery data, no access/entitlement data, incomplete pre-2026-04-09 refund history, only most-recent refund fields).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and sectioned, which helps, but it is enormously long for a tool description and repetitive — the 'use list_subscription_payments for per-charge history' and 'update via dashboard or customer portal' points recur four or more times, and much reads like a support playbook rather than tool selection guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return-value documentation is not strictly required, yet the description still explains the fields agents must interpret (status, currentPeriodEnd, couponSnapshot, paymentError, trial fields) and closes the loop on routing, pagination, and date formats. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, yet the description adds real semantics: search is a contains match over customerEmail/customerName/productTitle/orderId, past_due counts as active for 'active' counts, UTC-only timestamps with Z suffix, cursor pagination rules (starting_after/ending_before mutually exclusive, max 100/default 10), and limit guidance for single-record lookups.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Retrieve a paginated list of subscriptions processed through your Checkout Page account.' It immediately distinguishes itself from siblings by naming the other transaction tools and the cross-tool routing section clarifies that subscriptions, payments, and bookings are disjoint record sets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use examples ('Find the subscription for order ORD-9182' → orderId), when to prefer search vs. exact filters, and when to route elsewhere (list_subscription_payments, list_payments, list_bookings, list_customers/get_customer). It even states when the tool cannot answer (MRR in dashboard, refunds in dashboard).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tax_ratesARead-onlyInspect
List all fixed tax rates configured for this Checkout Page account.
Use this tool to find an existing tax rate before creating a new one or when setting up a page with tax.mode: "fixed". Check whether a suitable rate already exists — avoid creating duplicates.
This tool returns all rates — there is no filtering or pagination.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond them — that the result is unfiltered and unpaginated, i.e. a complete dump — which matters for how an agent consumes it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose then usage then a return caveat. No repetition of the title or annotations; every sentence adds a distinct fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't explain return values, and annotations cover the safety profile. Purpose, usage, and the unfiltered/unpaginated return characteristic are all covered, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and schema coverage is 100%, so there is nothing for the description to clarify. Baseline for a no-param tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (fixed tax rates) scoped to the Checkout Page account. It is clearly distinguishable from the sibling create_tax_rate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: to find an existing tax rate before creating a new one, or when configuring a page with tax.mode "fixed". It even names the anti-goal (avoid creating duplicates), so an agent knows both the trigger and the reason.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_theme_propertiesARead-onlyIdempotentInspect
List the design and label properties a checkout page, event or form can override, with their value format and allowed values. A property with a fixed default (every label, and a few other properties) lists it; the others follow the page's theme. Read-only, from a fixed list of about 800 properties: narrow it with group, prefix or a search of one or two words, such as button radius or pay button color, since the whole list, or the whole elements group, is too long to read at once. A search lists the properties that match every word or, when none do, those that match any word, best match first, and at most 40 of them: total counts every match, and note says when to narrow the search or which word matched nothing.
prefix takes the path of the part of the page you are changing. elements.product.* is the product column (title, logo, pricing, pricePicker for the price options), elements.checkout.* the checkout column (cards, variants, ticketGroups, pwyw, confirmation), and elements.checkout.form.* the form (fields, button, priceBreakdown, paymentDetails, discountCode, manualPayments). The tokens, layout and labels groups are small enough to list whole.
Set them under themeOverrides on create_checkout_page, update_checkout_page, create_event, update_event, create_form and update_form, nested by path: tokens.colorPrimary is { "tokens": { "colorPrimary": { "light": "#1A73E8" } } }. Keys you leave out keep their value, and null resets a property, or everything under a key, to the theme default. Labels are the text customers see, so translate a page by setting them. hostedLayoutType (center, double or split) picks the page layout; layout.* properties style the layout they name.
Value formats by type:
color:
{ "light": ..., "dark": ... }, one color for light and one for dark color mode. The page shows the one for its color mode,tokens.colors. Either can be left out. Each is any CSS color value, for example#1A73E8,rgb(26 115 232),hsl(214 82% 51%)or a named color such asnavy. The API refuses;,{,},<and>but doesn't check that the value is a valid color: an invalid one is stored, and the browser ignores it on the page.font: a Google Fonts family name, such as
Inter.size, fontSize: a number of pixels, or
""for Auto whenoptionslists it.fontWeight: 100 to 900 in steps of 100.
toggle:
trueorfalse.image:
{ "file": "<id>" }, the ID of an image uploaded with upload_file.text: plain text or inline markdown, no HTML.
customCsstakes CSS instead.select, shadow, alignment, fontStyle: one of
options. When a property hasoptions, only those values are accepted.
customCss needs a plan that includes custom CSS, and the Powered by Checkout Page and Powered by Stripe badges can only be changed with a paid subscription. A null reset works on any plan.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Only list one group. `tokens`: brand colors, fonts and corner radius used across the page. `layout`: backgrounds, images and column settings of each hosted layout. `labels`: the text customers see, which is also where translations go. `elements`: styling of single parts of the page, such as the title, price options, variants, form fields, pay button and trust badges. `customCss`: CSS added to the page, for changes the other properties cannot make. | |
| prefix | No | Only list the properties under this path, matched on whole segments, for example `elements.product.pricePicker` or `elements.checkout.form.button`. The cheapest way to read the properties of one part of the page. | |
| search | No | One or two words for what you are changing, for example `button radius`, `pay button color` or `heading font`, or a path or key such as `colorPrimary`. Each word matches the start of a word in the property path or description, case-insensitively, so `radi` finds `borderRadius`. Common words such as `corner`, `rounded`, `pay button` and `colour` find the properties they mean. Lists the properties that match every word or, when none do, those that match any word, best match first, and at most 40 of them. Words such as `the`, `on` or `make` are ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The theme properties the page tools accept under `themeOverrides`. |
| note | No | Set when a search was cut to its best matches, matched only some of its words, or had a word nothing matches: what to change in the next call. |
| total | Yes | Number of properties that match. A search returns at most the best 40, so `total` can be more than the rows in `data`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld=false, but the description adds real behavioral context: a fixed list of ~800 properties, a 40-result cap per search with `total` and `note` semantics, plan gating for `customCss` and the Powered-by badges, and the fact that the API rejects `;{}<>` yet does not validate color values. That goes well beyond the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and narrowing advice are front-loaded, and the type-format list is bulleted and scannable. It is nonetheless long (several dense paragraphs) and some path/structure detail overlaps the schema, so it is efficient but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex read tool with an output schema present, the description supplies everything an agent needs to call it correctly: how to scope the query, the shape of the values, how to nest them under themeOverrides, reset semantics (`null`), and plan restrictions. Return values are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents group/prefix/search, so the baseline is 3. The description nonetheless adds usable semantics beyond it: the `elements.product.*` / `elements.checkout.*` / `elements.checkout.form.*` path structure, worked search examples (`button radius`, `pay button color`), and the any-word fallback ranking behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a precise verb (List) and resource (design and label properties a checkout page, event or form can override), plus the scope of what is returned (value format and allowed values). It is immediately distinguishable from sibling tools like list_themes, get_theme or update_theme.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to narrow (`group`, `prefix`, `search`) because the full list or the `elements` group is too long to read at once, and notes which groups are small enough to list whole. It also routes the agent to the mutation tools where these properties are set (create/update_checkout_page, event, form), though it does not contrast with list_themes/get_theme directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_themesARead-onlyInspect
List the themes your pages can use: your own and the built-in ones, sorted by id from highest to lowest, so a theme you create appears before older ones. Built-in themes were installed together, so their order doesn't follow createdAt. Use a theme's id as themeId on a page, or as baseThemeId to create a copy. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| scope | No | Only return built-in themes (`global`) or themes your account created (`seller`). | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the description's closing 'Read-only' is redundant. It earns credit instead for disclosing non-obvious behavior: results are sorted by id descending, and built-in themes do not follow `createdAt` ordering, which affects pagination expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the core purpose and the sort behavior, and the trailing 'Read-only' is a cheap redundancy. The createdAt caveat is useful but slightly verbose, keeping it just short of ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description only needs to add the sorting semantics and the downstream id usage — both of which it does. Nothing an agent needs to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit, scope, and both cursor parameters are fully documented in the schema itself. The description adds only indirect color about id-based ordering, which loosely relates to the id-cursor pagination but does not extend the parameters' semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list themes) and defines the exact scope: the account's own themes plus built-in ones. An agent can immediately tell this apart from get_theme, list_theme_properties, and create_theme without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear downstream context — use the returned id as `themeId` on a page or as `baseThemeId` to create a copy — which tells the agent why and how the result is consumed. However, it never names an alternative tool or a when-not condition (e.g., when to prefer get_theme for a single theme).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ticketsARead-onlyInspect
List individual attendee tickets from paid event bookings on the Checkout Page account - one record per attendee, with full check-in history and per-ticket revenue allocation. Pass livemode: false to read test-mode records. Use it for guest lists, door and check-in questions, and locating a named attendee. Each ticket carries checkInCode, the opaque check-in credential to encode when rendering the ticket QR code. Read-only; a booking produces several tickets, so for the order or payment behind them query list_bookings by bookingId.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of records per page (integer, max 100, default 10). | |
| pageId | No | Return only tickets for a single event page. Use this to build a guest list for one event. | |
| search | No | Case-insensitive search matched against `attendeeEmail`, `attendeeName`, `ticketShortId` and `orderId`. The query is routed based on input shape: email-like inputs (`jane@example.com`) match `attendeeEmail` only; an 8-digit input (`64819115`) is treated as a whole order reference and matched exactly against `orderId`; other identifier-like inputs containing a digit, underscore or hyphen match `ticketShortId` and `orderId`; multi-word inputs match `attendeeName` and `ticketShortId`; any other single bare word falls back to a broad substring match across `attendeeName`, `attendeeEmail` and `ticketShortId`. Best default when the guest is identified by name, email, or the code on their ticket. A booking produces one ticket per attendee - always review all matches, not just the first. | |
| status | No | Filter by ticket status. Valid values: PAID, CANCELED. Use "PAID" for tickets valid for admission and "CANCELED" for voided ones. An unfiltered list includes both. | |
| orderId | No | Exact match on the order reference shared by every ticket in a booking. Partial values do not match — use `search` for that. | |
| livemode | No | Set to false to read test-mode records (created while a page was in test mode). Defaults to live records. | |
| bookingId | No | Return the tickets created by one booking. Use when you already have the booking from the bookings endpoint and want the individual attendee tickets. | |
| customerId | No | Return every ticket booked by one customer, across events. Useful when you already have the customer record. | |
| createdAfter | No | Inclusive lower bound on ticket createdAt. ISO-8601 UTC datetime with the `Z` suffix (e.g. `2026-01-01T00:00:00Z`). Never use a local timezone offset — tickets are stored and compared in UTC. | |
| ticketTypeId | No | Return only tickets of one ticket type (e.g. VIP). Combine with `pageId` when the same type name exists on several events. | |
| checkInStatus | No | Filter by check-in state. Valid values: UNCHECKEDIN, CHECKEDIN. "CHECKEDIN" returns guests currently admitted; "UNCHECKEDIN" returns both guests who were checked back out and guests who have never been checked in. | |
| createdBefore | No | Inclusive upper bound on ticket createdAt. ISO-8601 UTC datetime with the `Z` suffix (e.g. `2026-12-31T23:59:59Z`). Never use a local timezone offset — tickets are stored and compared in UTC. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only safety profile, but the description adds real behavioral context beyond them: one record per attendee, cardinality (a booking produces several tickets), full check-in history and per-ticket revenue allocation, the checkInCode credential's purpose, and livemode test-vs-live behavior. This is genuinely useful disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and one-record-per-attendee scope, then use cases, then the sibling routing. It is dense but nearly every sentence carries signal; slightly long but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 14 optional filters fully documented in the schema, an output schema present, and annotations covering safety, the description adds exactly the missing pieces: ticket cardinality, the checkInCode semantics, and the list_bookings handoff. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema (including the elaborate search routing and date bounds). The description only restates livemode and mentions checkInCode, adding little parameter meaning beyond structured fields; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with clear scope: individual attendee tickets from paid event bookings, one record per attendee. It explicitly differentiates itself from list_bookings (for the order/payment behind the tickets) and update_ticket, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete use cases (guest lists, door/check-in questions, locating a named attendee) and gives an explicit routing rule: for the order or payment behind the tickets, query list_bookings by bookingId. When-to-use and the alternative are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_webhooksARead-onlyInspect
List the webhook endpoints registered on this Checkout Page account, newest first, with their subscribed events, status and delivery counters. The signing secret is never returned and custom header values are shown as [hidden]; headers are viewed and edited at the returned dashboardUrl. This is how to find a webhook id for get_webhook or delete_webhook, and how to check whether a URL is already registered before calling create_webhook. Read-only. Webhooks are returned sorted newest-first. Use cursor-based pagination (starting_after / ending_before) to page through large result sets. starting_after and ending_before cannot be used simultaneously. Max limit is 100, default is 10.
| Name | Required | Description | Default |
|---|---|---|---|
| event | No | Only return webhooks subscribed to this event, for example `payment.paid`. | |
| limit | No | Number of records per page (integer, max 100, default 10). | |
| status | No | Only return webhooks with this status. Valid values: active, inactive, failed. | |
| ending_before | No | Cursor-based pagination. Pass a record `id` to return results before it. Cannot be used with `starting_after`. | |
| starting_after | No | Cursor-based pagination. Pass a record `id` to return results after it. Cannot be used with `ending_before`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| total | Yes | Total number of records matching the query across all pages. |
| has_more | Yes | Whether more records exist beyond the current page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds non-obvious behavior: the signing secret is never returned, custom header values are masked as '[hidden]', headers are managed via dashboardUrl, results are newest-first, and starting_after/ending_before are mutually exclusive. These are genuine operational details beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the routing guidance, with pagination details at the end. Slightly repetitive — 'newest first' appears in the opening sentence and again as 'sorted newest-first' — costing it the top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description supplies everything an agent needs: return-field highlights, masking behavior, sorting, and pagination rules. No gaps remain for a read-only list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents event, status, limit, and the cursor params. The description mostly restates schema content (max limit 100/default 10, cursor mutual exclusivity) rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (webhook endpoints) scoped to 'this Checkout Page account', and describes the returned fields (subscribed events, status, delivery counters). An agent can distinguish it immediately from get_webhook, create_webhook, and the other list_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it: to find an id for get_webhook/delete_webhook and to check whether a URL is already registered before create_webhook. This routes the agent to sibling tools and states the triggering conditions, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_subscription_cancellationARead-onlyInspect
This tool does not cancel the subscription. Cancellation happens only in the Checkout Page dashboard. The tool fetches the subscription, works out whether it can be canceled and what canceling changes, and returns the dashboard URL where a person performs the cancellation.
Returns:
The full subscription record (status, customer, amount, interval, current period dates).
guidance.eligible- whether cancellation can proceed (false for already-canceled or expired subscriptions).guidance.options.timing- available timing choices (immediately,at_period_end,custom_date). Fixed-term plans (planIterations > 0) only supportimmediately.guidance.options.currentPeriodEnd- the end of the current billing period, useful when choosingat_period_end.guidance.sideEffects- plain-language consequences of canceling (the Stripe subscription ends and no further invoices generate; whether a cancellation is already scheduled).
Use list_subscriptions first to find a subscription ID, or get_subscription to view the full record without the cancellation guidance overlay.
Example uses:
"I want to cancel this customer's subscription - what should I know first?"
"Can subscription 6812fe6e9f39b6760576f01c still be canceled at the end of the period?"
"What changes if I cancel this subscription now?"
| Name | Required | Description | Default |
|---|---|---|---|
| subscriptionId | Yes | The ID of the subscription you intend to cancel. This tool returns eligibility, side effects, and a dashboard link — it does NOT perform the cancellation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| guidance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it readOnlyHint=true and destructiveHint=false, but the description adds substantial non-obvious behavior: it does not mutate anything, returns a dashboard URL for human completion, and encodes eligibility rules (false for already-canceled/expired) plus timing constraints (fixed-term plans only support 'immediately'). This is far beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical caveat and the non-cancellation behavior are front-loaded, and the sections (caveat, Returns, cross-references, examples) are cleanly separated. Some of the 'Returns' detail overlaps with the existing output schema, so it is slightly longer than strictly necessary, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only nature and an output schema being present, the description fully covers what an agent needs: the surprising non-cancellation semantics, eligibility/timing, side effects, and how to obtain the required ID. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already well documented with a pattern and an inline note that cancellation is not performed. The description adds marginal value by telling the agent how to source the ID (via list_subscriptions), which is beyond the schema's scope.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource and immediately disambiguates the most likely misunderstanding: it explicitly says 'This tool does not cancel the subscription' and explains what it actually does (fetches, evaluates eligibility/side effects, returns a dashboard URL). It also names siblings (list_subscriptions, get_subscription) so an agent can route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use context ('Use list_subscriptions first to find a subscription ID, or get_subscription to view the full record without the cancellation guidance overlay'), states where the actual cancellation occurs, and provides concrete example phrasings that map to the tool's intended use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
regenerate_invoiceADestructiveInspect
Regenerate the PDF for an invoice by id. Overwrites the stored billing details on the invoice with the current ones from the source payment and its customer, overwrites the PO number when the payment has one, and fills in the customer email, customer name and product title only where the invoice has none. It then replaces the existing hosted PDF - the previous PDF is not kept. Preserves line items, amounts, taxes, and status. The returned invoiceUrl is a fresh signed link.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The ID of the invoice to regenerate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description goes well beyond that by disclosing exactly what is overwritten (billing details, PO number), what is only filled when empty (email, name, product title), what is preserved (line items, amounts, taxes, status), and that the previous hosted PDF is discarded. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the remaining sentences each carry distinct, useful information about overwrite/preserve semantics. It is slightly dense and run-on, but nearly every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations cover the safety profile and an output schema exists, so return values need not be explained; nonetheless the description notes the returned `invoiceUrl` is a fresh signed link. For a single-parameter mutation tool, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter at 100% schema description coverage and a defined pattern, the schema already documents everything about `id`. The description only echoes "by id" and adds no format or sourcing detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Regenerate the PDF for an invoice by id") and gives the exact scope of the operation. It is unambiguous, and no sibling tool performs this operation, so an agent can identify it without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description thoroughly explains what happens when the tool runs, which implies when it is useful (after source payment/customer data changes). However, it never explicitly states when to choose this over alternatives like get_invoice or list_invoices, nor does it state preconditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_checkout_pageADestructiveInspect
Update an existing checkout page's content and settings. Supports a subset of create's fields; read current values with get_checkout_page before a partial update. Prices, variants, stock and other product settings are not on the page: use update_product with the page's data.product.id. Custom fields are managed with create_field, update_field and delete_field. The change applies to the live page at once: customers see it right away. There is no undo, because the previous values are not kept. For the page's design and customer-facing labels (including translations), set themeOverrides and hostedLayoutType; list_theme_properties lists what can be set. Set themeId (from list_themes) to use a theme; changing it replaces the page's own theme settings.
| Name | Required | Description | Default |
|---|---|---|---|
| tax | No | Tax configuration for this page. Defaults to Stripe Tax when omitted. | |
| fees | No | ||
| name | No | Internal page name used in your dashboard and API responses. | |
| slug | No | Page URL slug. For events and forms the slug defaults to the slugified version of your `title`. For checkouts the slug defaults to the slugified version of your `productData.title`. | |
| locale | No | ||
| pageId | Yes | The ID of the checkout page to update. | |
| status | No | ||
| themeId | No | The theme the page uses: one of your themes or a built-in one (see List themes). Changing it replaces all of the page's own theme settings, including order bump styling set in the dashboard, so the page looks like the theme. That drops the page's labels too, translations included: send the ones to keep in `themeOverrides` in the same request, which apply on top. The page's locale is kept. | |
| imageIds | No | Array of images for the page gallery. All referenced file IDs must exist and belong to your account. Pass null to clear the gallery. | |
| redirect | No | If enabled, redirects the customer to the specified URL before the page loads. | |
| testmode | No | Puts the page in test mode. While it is on, every purchase on this page is a test purchase: no money is taken, the buyer still receives everything the page delivers, and the records are created with `livemode: false`. Turn it off to take real payments again. | |
| funnelSteps | No | Ordered funnel configuration for this page. Supports intermediate checkout steps, one-click upsells, and confirmation behavior. Field references inside upsell/confirmation redirect steps resolve by `fieldId` (get current field IDs from the page detail response) — the create-time `fieldKey` string is rejected. | |
| googleIndex | No | Allow Google to index this page for search results. Defaults to `true`. | |
| notifyEmail | No | Email addresses to send notifications to. Supports comma separated emails. | |
| redirectUrl | No | URL to redirect to after payment. Applies if `afterPaymentAction` is `redirect`. | |
| trackingCodes | No | Custom tracking scripts to include on the page. Supports HTML `<script>` tags. | |
| paymentMethods | No | ||
| paymentOptions | No | ||
| redirectPageId | No | ID of the page (checkout, event or form) to redirect to after payment. Applies when `afterPaymentAction` is `checkout`. | |
| themeOverrides | No | The page's design and labels, set on top of its theme and nested by theme property path: `tokens.colorPrimary` is sent as `{ "tokens": { "colorPrimary": { "light": "#1A73E8" } } }`. Keys you leave out keep their current value, and `null` resets a property, or everything under a key, to the theme default. Call `list_theme_properties` for the supported properties, their value formats and, where a property has a fixed one, its default. | |
| invoiceSettings | No | ||
| redirectUrlPath | No | Additional path parameters appended to the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. To reference a field value, use `fieldId` (the persisted field ID, from the page detail response) instead of the create-time `fieldKey`. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| hostedLayoutType | No | ||
| redirectUrlQuery | No | Query parameters for the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. To reference a field value, use `fieldId` instead of the create-time `fieldKey`. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| allowDynamicLabel | No | ||
| allowDynamicPrice | No | ||
| allowDynamicTitle | No | Allow page title to be overridden via URL query parameters. | |
| savePaymentMethod | No | ||
| afterPaymentAction | No | Behavior after checkout. `confirmation` shows the confirmation page. `checkout` redirects to `redirectPageId`. `redirect` sends the customer to `redirectUrl`. Defaults to `confirmation`. | |
| limitSubscriptions | No | Deprecated — superseded by `productData.limitSubscriptions.enabled`. Accepted and applied to the page's product. | |
| checkoutAbandonment | No | ||
| showCouponCodeField | No | ||
| sendEmailConfirmation | No | Send an email confirmation to the customer. Defaults to `true`. | |
| redirectUrlInsideEmbed | No | If the page is embedded, redirect the customer within the embed instead of redirecting the main browser window. Defaults to `false`. | |
| allowDynamicDescription | No | Allow page description to be overridden via URL query parameters. | |
| allowDynamicRedirectUrl | No | ||
| sendPaymentNotification | No | Send payment/submission notification emails to the store owner. | |
| showCouponCodeFieldType | No | ||
| closePopupOnClickOutside | No | Whether a popup embed closes when clicking outside the container. Defaults to `false`. | |
| confirmationEmailMessage | No | Custom confirmation email message. Accepts HTML or plain text. | |
| confirmationEmailSubject | No | Custom confirmation email subject. | |
| limitSubscriptionsStripe | No | Deprecated — superseded by `productData.limitSubscriptions.limitSubscriptionsStripe.enabled`. Accepted and applied to the page's product. | |
| confirmationCheckoutTitle | No | Confirmation title. | |
| confirmationEmailShowLogo | No | Show store logo in confirmation email. | |
| allowDynamicPlanIterations | No | Allow subscription plan iterations to be overridden via URL query parameters. | |
| customizeEmailConfirmation | No | Use a custom email confirmation template. If enabled, provide `confirmationEmailSubject` and `confirmationEmailMessage`. | |
| confirmationCheckoutMessage | No | Confirmation message. Accepts HTML or plaintext. | |
| allowDynamicPreselectedPrice | No | ||
| customizeCheckoutConfirmation | No | If set to true `confirmationCheckoutMessage` and `confirmationCheckoutTitle` will be displayed on the confirmation page. Defaults to `false`. | |
| confirmationEmailShowStoreName | No | Show store name in confirmation email. | |
| allowDynamicDiscountedFromPrice | No | ||
| sendCanceledSubscriptionNotifications | No | Send notifications when subscriptions are canceled. | |
| sendRecurringPaymentFailedNotifications | No | Send notifications when recurring payments fail. | |
| enableFileAccessForInactiveSubscriptions | No | Deprecated — superseded by `productData.enableFileAccessForInactiveSubscriptions`. Accepted and applied to the page's product. | |
| sendRecurringPaymentSucceededNotifications | No | Send notifications when recurring payments succeed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description goes well beyond them: changes go live instantly with no undo and no retained previous values, and changing themeId replaces the page's own theme settings including order bump styling and translations. These are non-obvious consequences an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six sentences, front-loaded with the core action and partial-update warning, then side effects, then the design-related parameters. Every sentence carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 55-parameter mutation tool with an output schema present, the description covers scope, required pre-read, sibling routing, irreversible side effects, and the tricky theme/design parameters. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 71%, so the schema carries most parameter detail. The description still adds value by explaining that themeOverrides and hostedLayoutType control design and customer-facing labels/translations, and that set themeId replaces page-level theme settings — guidance not fully captured by the field descriptions alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update an existing checkout page's content and settings') and immediately scopes it against the sibling create tool ('supports a subset of create's fields'). An agent can distinguish it from create_checkout_page, update_product, and update_form without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance: read current values with get_checkout_page before a partial update; use update_product for prices/variants/stock; manage custom fields via create_field/update_field/delete_field; use list_theme_properties and list_themes for design work. This is textbook when/when-not/alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_couponADestructiveInspect
Update an existing coupon in your Checkout Page account.
Only the fields you supply are changed; omitted fields are left as-is. Send null for maxRedemptions or redeemBy to remove that limit. pageIds and ticketTypeIds are replaced wholesale rather than merged - send the full list you want, or an empty array to clear it.
What cannot be changed: the discount itself. code, amountOff, percentOff, currency, duration, and durationInMonths are fixed once a coupon exists, because they are mirrored into Stripe. To change a discount, soft delete this coupon (deleted: true) and create a replacement with create_coupon.
Coupons created before 2025-10-04 cannot be updated at all — their redemption limits are synced with Stripe and the API returns a 400 saying so.
Ticket types are scoped through pages, so any ticketTypeIds must belong to the pageIds sent in the same request — or, when pageIds is omitted, to the pages already on the coupon.
This tool modifies live data. Every change applies to live checkouts at once. There is no undo, because the previous values are not kept. Setting deleted: true stops the coupon working at checkout immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Internal name for the coupon. | |
| deleted | No | Set true to soft delete the coupon. It stops working at checkout but its data and redemption history are retained. | |
| pageIds | No | The pages this coupon can be used on. Replaces the existing list. An empty array clears it, making the coupon valid everywhere. | |
| couponId | Yes | The ID of the coupon to update. Use `list_coupons` first if you need to discover the coupon ID by code or label. | |
| redeemBy | No | The ISO datetime that this coupon must be used before. Send `null` to remove the expiry. | |
| ticketTypeIds | No | The ticket types this coupon can be used with. Replaces the existing list; an empty array clears it. Every ID must belong to a page in `pageIds` — or, when `pageIds` is omitted, to the pages already on the coupon. | |
| maxRedemptions | No | The total number of times this coupon can be redeemed across all customers. Doesn't limit a single customer from redeeming multiple times. Send `null` to remove the limit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring destructiveHint=true and readOnlyHint=false, the description goes further by disclosing live-data impact, no undo because previous values are not kept, immediate effect of deleted:true, partial-update semantics, immutable fields, and the 400 error for old coupons. This is rich behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly structured with bold headings for unchangeable fields, replacement behavior, and live-data impact. Every sentence carries operational weight, and the most important constraints are front-loaded after the opening sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with seven parameters, one required field, and an output schema, this description covers invocation semantics, constraints, alternatives, failure modes, and safety implications. Nothing an agent needs to call it correctly appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds cross-field meaning that the schema does not: omitted fields remain unchanged, null removes limits, pageIds and ticketTypeIds are replaced wholesale, and ticketTypeIds must belong to the same pageIds or existing coupon pages. It also lists exactly which fields cannot be changed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: updating an existing coupon in the Checkout Page account. It distinguishes this tool from create_coupon by naming the alternative for discount changes, and from list_coupons indirectly through the couponId discovery note in the schema. An agent can immediately tell this is the mutation path for existing coupons.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: partial updates, null for removing limits, wholesale replacement for pageIds and ticketTypeIds, and soft deletion for stopping redemption. It also names the alternative workflow for changing immutable discount fields via create_coupon. The 2025-10-04 cutoff explains when this tool cannot be used at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_customerADestructiveInspect
Update the editable details of a customer record in your Checkout Page account.
Use list_customers first if you need to discover the customer ID by name or email. If the customer ID does not exist, returns a 404 error: "Customer not found".
Only the fields you supply are changed; omitted fields are left as-is. The address and shipping subdocuments use patch semantics — supply only the sub-fields you want to change. Send null for any optional field (or for a whole subdocument) to clear it. The primary email field cannot be cleared.
This tool modifies live data and notifies external systems. Every successful update sends a customer.updated webhook, carrying the full updated customer profile, to each endpoint the merchant has subscribed to that event.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Customer full name. Send `null` to clear. | |
| No | Primary customer email address. Trimmed and lowercased before storage. Cannot be cleared via this endpoint. | ||
| phone | No | Customer phone number. Send `null` to clear. | |
| address | No | Billing address. Patch semantics — only the subfields you supply are changed. Send `null` to clear the whole subdocument. | |
| shipping | No | Shipping details. Patch semantics — only the fields you supply are changed (including nested `shipping.address` subfields). Send `null` to clear the whole subdocument. | |
| customerId | Yes | The ID of the customer to update. Use `list_customers` first if you need to discover the customer ID by name or email. | |
| companyName | No | Customer company name. Send `null` to clear. | |
| billingEmail | No | Billing email address. Can be different from the primary email. Trimmed and lowercased before storage. Send `null` to clear. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses patch semantics, that omitted fields are untouched, that `null` clears optional fields/subdocuments, that `email` cannot be cleared, the exact 404 behavior, and critically that every successful update fires a `customer.updated` webhook to external endpoints. The destructiveHint/openWorldHint annotations are confirmed and enriched with concrete consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then discovery guidance, then semantics, then the bolded side-effect warning — a sensible ordering with no filler sentences. Slight redundancy with the schema's per-field patch/null notes costs it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the description covers the remaining unknowns an agent needs: partial-update semantics, clearing behavior, error behavior, and the external webhook side effect. Nothing material is missing for an 8-parameter mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents most parameters; the baseline is 3. The description adds cross-field semantics not present in any single schema entry — the global 'only supplied fields change' rule, whole-subdocument patch/clear behavior, and the email-clearing exception — earning a modest bump above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update the editable details of a customer record') with the account scope named. It also routes the agent to the sibling `list_customers` for ID discovery, so it is distinguishable from at least one adjacent tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ('Use `list_customers` first if you need to discover the customer ID by name or email'), which is actionable context for a tool requiring a customerId. It does not state when NOT to use this tool (e.g. use get_customer for read-only inspection), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventADestructiveInspect
Update an existing event page's content and settings. Supports a subset of create's fields; read current values with get_event before a partial update. Custom fields are managed with create_field, update_field and delete_field, and ticket types with create_ticket_type, update_ticket_type and archive_ticket_type. The change applies to the live page at once: customers see it right away. There is no undo, because the previous values are not kept. For the page's design and customer-facing labels (including translations), set themeOverrides and hostedLayoutType; list_theme_properties lists what can be set. Set themeId (from list_themes) to use a theme; changing it replaces the page's own theme settings.
| Name | Required | Description | Default |
|---|---|---|---|
| tax | No | ||
| fees | No | ||
| name | No | Internal page name used in your dashboard and API responses. | |
| slug | No | Page URL slug. For events and forms the slug defaults to the slugified version of your `title`. For checkouts the slug defaults to the slugified version of your `productData.title`. | |
| title | No | ||
| locale | No | ||
| pageId | Yes | The ID of the event page to update. | |
| status | No | ||
| themeId | No | The theme the page uses: one of your themes or a built-in one (see List themes). Changing it replaces all of the page's own theme settings, including order bump styling set in the dashboard, so the page looks like the theme. That drops the page's labels too, translations included: send the ones to keep in `themeOverrides` in the same request, which apply on top. The page's locale is kept. | |
| imageIds | No | ||
| redirect | No | If enabled, redirects the customer to the specified URL before the page loads. | |
| testmode | No | Puts the page in test mode. While it is on, every purchase on this page is a test purchase: no money is taken, the buyer still receives everything the page delivers, and the records are created with `livemode: false`. Turn it off to take real payments again. | |
| description | No | ||
| funnelSteps | No | Ordered funnel configuration for this page. Supports intermediate checkout steps, one-click upsells, and confirmation behavior. Field references inside upsell/confirmation redirect steps resolve by `fieldId` (get current field IDs from the page detail response) — the create-time `fieldKey` string is rejected. | |
| googleIndex | No | Allow Google to index this page for search results. Defaults to `true`. | |
| notifyEmail | No | Email addresses to send notifications to. Supports comma separated emails. | |
| redirectUrl | No | URL to redirect to after payment. Applies if `afterPaymentAction` is `redirect`. | |
| eventDetails | No | Event-specific details like type, dates, location. Ticket-specific discounts (`discounts[].ticketTypeIds`) must reference existing ticket types by `{ id }` — update cannot create new ticket types to key against, so the create-time `{ key }` form is rejected. | |
| trackingCodes | No | Custom tracking scripts to include on the page. Supports HTML `<script>` tags. | |
| paymentMethods | No | ||
| paymentOptions | No | ||
| redirectPageId | No | ID of the page (checkout, event or form) to redirect to after payment. Applies when `afterPaymentAction` is `checkout`. | |
| themeOverrides | No | The page's design and labels, set on top of its theme and nested by theme property path: `tokens.colorPrimary` is sent as `{ "tokens": { "colorPrimary": { "light": "#1A73E8" } } }`. Keys you leave out keep their current value, and `null` resets a property, or everything under a key, to the theme default. Call `list_theme_properties` for the supported properties, their value formats and, where a property has a fixed one, its default. | |
| invoiceSettings | No | ||
| redirectUrlPath | No | Additional path parameters appended to the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. To reference a field value, use `fieldId` (the persisted field ID, from the page detail response) instead of the create-time `fieldKey`. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| hostedLayoutType | No | ||
| redirectUrlQuery | No | Query parameters for the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. To reference a field value, use `fieldId` instead of the create-time `fieldKey`. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| allowDynamicLabel | No | ||
| allowDynamicPrice | No | ||
| allowDynamicTitle | No | Allow page title to be overridden via URL query parameters. | |
| savePaymentMethod | No | ||
| afterPaymentAction | No | Behavior after checkout. `confirmation` shows the confirmation page. `checkout` redirects to `redirectPageId`. `redirect` sends the customer to `redirectUrl`. Defaults to `confirmation`. | |
| checkoutAbandonment | No | ||
| showCouponCodeField | No | ||
| sendEmailConfirmation | No | Send an email confirmation to the customer. Defaults to `true`. | |
| redirectUrlInsideEmbed | No | If the page is embedded, redirect the customer within the embed instead of redirecting the main browser window. Defaults to `false`. | |
| allowDynamicDescription | No | Allow page description to be overridden via URL query parameters. | |
| allowDynamicRedirectUrl | No | ||
| sendPaymentNotification | No | Send payment/submission notification emails to the store owner. | |
| showCouponCodeFieldType | No | ||
| closePopupOnClickOutside | No | Whether a popup embed closes when clicking outside the container. Defaults to `false`. | |
| confirmationEmailMessage | No | Custom confirmation email message. Accepts HTML or plain text. | |
| confirmationEmailSubject | No | Custom confirmation email subject. | |
| confirmationCheckoutTitle | No | Confirmation title. | |
| confirmationEmailShowLogo | No | Show store logo in confirmation email. | |
| showConfirmationEventName | No | ||
| customizeEmailConfirmation | No | Use a custom email confirmation template. If enabled, provide `confirmationEmailSubject` and `confirmationEmailMessage`. | |
| confirmationCheckoutMessage | No | Confirmation message. Accepts HTML or plaintext. | |
| showConfirmationEventAddOns | No | ||
| allowDynamicPreselectedPrice | No | ||
| showConfirmationEventTickets | No | ||
| customizeCheckoutConfirmation | No | If set to true `confirmationCheckoutMessage` and `confirmationCheckoutTitle` will be displayed on the confirmation page. Defaults to `false`. | |
| showConfirmationAddToCalendar | No | ||
| showConfirmationEventDateTime | No | ||
| showConfirmationEventLocation | No | ||
| confirmationEmailShowStoreName | No | Show store name in confirmation email. | |
| allowDynamicDiscountedFromPrice | No | ||
| showConfirmationEventMeetingLink | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes well beyond that: it says the change hits the live page immediately, that there is no undo, that previous values are not retained, and that setting `themeId` overwrites the page's own theme settings and labels including translations. These are exactly the consequences an agent must surface before calling a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical constraints (live effect, no undo) are front-loaded in the middle of the paragraph rather than buried, and every sentence carries actionable content. It runs long at roughly seven sentences and the sibling enumeration could be tightened, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 58-parameter update with an output schema, the description covers the highest-risk behaviors, partial-update guidance, and where to look up theme values. It does not state what happens to omitted fields beyond the 'subset of create's fields' hint, which is the one meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 53% across 58 parameters, so most parameters are documented in the schema, but the description adds real semantics for only a handful: `themeOverrides`, `hostedLayoutType`, and `themeId`. It correctly points to `list_theme_properties` and `list_themes` for valid values, but the large majority of the 58 parameters get nothing from the description, so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a precise verb and resource ('Update an existing event page's content and settings'), and the sibling landscape (update_checkout_page, update_form) makes the scope unambiguous. It also flags that only a subset of create's fields is supported, which an agent needs in order to distinguish this from create_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite ('read current values with get_event before a partial update') and routes adjacent work to the correct siblings: fields to create_field/update_field/delete_field and ticket types to create_ticket_type/update_ticket_type/archive_ticket_type. When-to-use and when-to-use-something-else are both stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_fieldADestructiveInspect
Update one custom field on a checkout page, form, or event: label, element, type, options, required, hidden, default value, visibility rules and more. Only supplied properties change; options are replaced wholesale. Get field IDs from get_checkout_page, get_form, or get_event. Mutating.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Used to store field data in a predictable manner. Please note that you must use Customer Name and Shipping Address if you wish to use any of the shipping address data types. Do not set `type` when `element` is one of: `checkbox`, `quantity`, `tax-id`, `po-number`, `multiple-choice`, `multi-select`, `date-time`, `date`, `time`, `textarea`. | |
| label | No | Form label for the input element. | |
| order | No | Display order of this field. When omitted, order is determined by the position of the field in the array. | |
| hidden | No | Whether this field is hidden from customers at checkout. | |
| layout | No | How a multi-select field is drawn at checkout: `dropdown` (the default) or `list`, a list of checkboxes. Ignored on other elements. | |
| pageId | Yes | The ID of the page the field belongs to. | |
| collect | No | Whether to collect only a billing address or both billing and shipping. Applies to `address` elements. Defaults to `billing`. | |
| element | No | Input control used to render this field in checkout. Defaults to `text`. | |
| fieldId | Yes | The ID of the field. Field IDs are listed under `fields` in the page detail response from get_checkout_page, get_form, or get_event. | |
| options | No | Selectable options for `select`, `multi-select` and `multiple-choice` elements. Replaced wholesale: every option gets a new ID, so re-point any other field whose showHideLogic references one of these options afterwards. Options on a `multi-select` need different values (an option without a value uses its label), and options on a `multiple-choice` need different labels. | |
| maxValue | No | Maximum allowed value settings for this field. | |
| minValue | No | Minimum allowed value settings for this field. | |
| pageType | Yes | The kind of page the field belongs to: `checkout`, `form`, or `event`. Use the type of the tool you fetched the page with (get_checkout_page, get_form, get_event). | |
| required | No | Whether this field must be completed before checkout can continue. | |
| reference | No | External reference ID for integration purposes. Generated from the field type or label when omitted. | |
| description | No | Optional helper text shown below the field label. | |
| placeholder | No | Specifies a short hint that describes the expected value of an input element | |
| defaultValue | No | Default value settings for the field. | |
| showHideLogic | No | Conditional visibility rules for this field. `element.elementId` must be the ID of another field on the same page, and `value` an option ID on that field (or `TRUE`/`FALSE` for a checkbox). Read the IDs from the page detail response; create-time keys are rejected here. | |
| defaultCountry | No | ISO 3166-1 alpha-2 country code used as the default for `address` elements. Defaults to `US`. | |
| collectShippingPhone | No | Whether to collect a phone number alongside the shipping address. Applies to `address` elements when `collect` is `billing_and_shipping`. Defaults to `false`. | |
| showSelectedDialCode | No | Whether to display the selected international dial code in phone inputs. | |
| limitAllowedCountries | No | Country restriction settings for country-based fields. | |
| limitBillingCountries | No | Restrict the billing country list. Applies to `address` elements. | |
| limitShippingCountries | No | Restrict the shipping country list. Applies to `address` elements when `collect` is `billing_and_shipping`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is covered; the description adds real context beyond them by disclosing that options are replaced wholesale (a destructive side effect) and that unsupplied properties are left untouched. It stops short of noting auth requirements or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with verb and resource, followed by the update semantics, the ID-sourcing prerequisite, and a one-word mutation flag. Every sentence carries information and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 25-parameter mutation tool, the description plus the 100%-covered schema and existing output schema cover what an agent needs to invoke it. Gaps are minor: no mention of permission requirements or what happens when a referenced field/option ID is invalid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with per-parameter descriptions covering the tricky cases (element/type interaction, showHideLogic value resolution, wholesale option replacement). The description's list of updatable properties is a useful summary but adds little the schema does not already document, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Update' on a specific resource 'one custom field' scoped to checkout pages, forms, and events, with an enumeration of the updatable properties. It clearly distinguishes itself from siblings like create_field and delete_field without the agent needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the prerequisite for obtaining field IDs (get_checkout_page, get_form, get_event) and clarifies PATCH semantics ('Only supplied properties change'). It does not explicitly route the agent away from update_checkout_page or update_form, but the 'one custom field' scoping makes the boundary evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_formADestructiveInspect
Update an existing form page's content and settings. Supports a subset of create's fields; read current values with get_form before a partial update. Custom fields are managed with create_field, update_field and delete_field. For the page's design and customer-facing labels (including translations), set themeOverrides and hostedLayoutType; list_theme_properties lists what can be set. Set themeId (from list_themes) to use a theme; changing it replaces the page's own theme settings.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Internal page name used in your dashboard and API responses. | |
| slug | No | Page URL slug. For events and forms the slug defaults to the slugified version of your `title`. For checkouts the slug defaults to the slugified version of your `productData.title`. | |
| title | No | Public title shown to customers on the page. | |
| locale | No | ||
| pageId | Yes | The ID of the form page to update. | |
| status | No | ||
| fileIds | No | Array of file IDs for downloadable files. All file IDs must exist and belong to your account. | |
| themeId | No | The theme the page uses: one of your themes or a built-in one (see List themes). Changing it replaces all of the page's own theme settings, including order bump styling set in the dashboard, so the page looks like the theme. That drops the page's labels too, translations included: send the ones to keep in `themeOverrides` in the same request, which apply on top. The page's locale is kept. | |
| imageIds | No | Array of images for the page gallery. All referenced file IDs must exist and belong to your account. | |
| redirect | No | If enabled, redirects the customer to the specified URL before the page loads. | |
| testmode | No | Puts the page in test mode. While it is on, every purchase on this page is a test purchase: no money is taken, the buyer still receives everything the page delivers, and the records are created with `livemode: false`. Turn it off to take real payments again. | |
| description | No | Page description shown to customers. Accepts HTML or plain text. | |
| formDetails | No | Form behaviour settings. | |
| funnelSteps | No | Ordered funnel configuration for this page. Supports intermediate checkout steps, one-click upsells, and confirmation behavior. Field references inside upsell/confirmation redirect steps resolve by `fieldId` (get current field IDs from the page detail response) — the create-time `fieldKey` string is rejected. | |
| googleIndex | No | Allow Google to index this page for search results. Defaults to `true`. | |
| notifyEmail | No | Email addresses to send notifications to. Supports comma separated emails. | |
| redirectUrl | No | URL to redirect to after payment. Applies if `afterPaymentAction` is `redirect`. | |
| trackingCodes | No | Custom tracking scripts to include on the page. Supports HTML `<script>` tags. | |
| redirectPageId | No | ID of the page (checkout, event or form) to redirect to after payment. Applies when `afterPaymentAction` is `checkout`. | |
| themeOverrides | No | The page's design and labels, set on top of its theme and nested by theme property path: `tokens.colorPrimary` is sent as `{ "tokens": { "colorPrimary": { "light": "#1A73E8" } } }`. Keys you leave out keep their current value, and `null` resets a property, or everything under a key, to the theme default. Call `list_theme_properties` for the supported properties, their value formats and, where a property has a fixed one, its default. | |
| invoiceSettings | No | ||
| redirectUrlPath | No | Additional path parameters appended to the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. To reference a field value, use `fieldId` (the persisted field ID, from the page detail response) instead of the create-time `fieldKey`. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| hostedLayoutType | No | ||
| redirectUrlQuery | No | Query parameters for the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. To reference a field value, use `fieldId` instead of the create-time `fieldKey`. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url) | |
| allowDynamicTitle | No | Allow page title to be overridden via URL query parameters. | |
| afterPaymentAction | No | Behavior after checkout. `confirmation` shows the confirmation page. `checkout` redirects to `redirectPageId`. `redirect` sends the customer to `redirectUrl`. Defaults to `confirmation`. | |
| sendEmailConfirmation | No | Send an email confirmation to the customer. Defaults to `true`. | |
| redirectUrlInsideEmbed | No | If the page is embedded, redirect the customer within the embed instead of redirecting the main browser window. Defaults to `false`. | |
| allowDynamicDescription | No | Allow page description to be overridden via URL query parameters. | |
| sendPaymentNotification | No | Send payment/submission notification emails to the store owner. | |
| closePopupOnClickOutside | No | Whether a popup embed closes when clicking outside the container. Defaults to `false`. | |
| confirmationEmailMessage | No | Custom confirmation email message. Accepts HTML or plain text. | |
| confirmationEmailSubject | No | Custom confirmation email subject. | |
| confirmationCheckoutTitle | No | Confirmation title. | |
| confirmationEmailShowLogo | No | Show store logo in confirmation email. | |
| customizeEmailConfirmation | No | Use a custom email confirmation template. If enabled, provide `confirmationEmailSubject` and `confirmationEmailMessage`. | |
| confirmationCheckoutMessage | No | Confirmation message. Accepts HTML or plaintext. | |
| customizeCheckoutConfirmation | No | If set to true `confirmationCheckoutMessage` and `confirmationCheckoutTitle` will be displayed on the confirmation page. Defaults to `false`. | |
| confirmationEmailShowStoreName | No | Show store name in confirmation email. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-read-only, so the safety profile is known. The description adds valuable specifics beyond that: changing themeId 'replaces all of the page's own theme settings' and 'drops the page's labels too, translations included', plus the partial-update contract. It could still say more about auth/permissions, but the destructive mechanics are well surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four front-loaded sentences that move from purpose to workflow guidance to design-field mechanics, with no filler. Dense but every sentence carries routing or behavioral information; only the themeOverrides/themeId sentence partially overlaps the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 39-parameter destructive mutation with an output schema and full annotations, the description covers the high-risk pieces (themeId replacement side effects, partial-update pattern, field management, theme overrides) adequately. It does not attempt to enumerate the many minor flags, which is reasonable given the schema covers them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 90%, so the schema already documents nearly every parameter (including themeId, themeOverrides, hostedLayoutType details). The description restates the themeOverrides/themeId semantics that the schema itself carries, adding little beyond it. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update an existing form page's content and settings') and immediately scopes it against siblings: a subset of create's fields, get_form for reading, and create_field/update_field/delete_field for custom fields. An agent can distinguish this from update_checkout_page/update_event without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing advice: read current values with get_form before a partial update, manage custom fields with the *_field tools, and consult list_theme_properties/list_themes before setting design fields. It stops short of explicitly disambiguating against sibling update_checkout_page/update_event, but the guidance present is specific and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_productADestructiveInspect
Update an existing product's prices, variants, stock, tax, files and other settings. This is where a page's pricing lives: use it, not update_checkout_page, to change what a page sells. Only the fields you supply change; prices[] and variants[] replace the full list, so read current values with get_product first. The change applies to every page that sells the product at once: customers see it right away. There is no undo, because the previous values are not kept.
| Name | Required | Description | Default |
|---|---|---|---|
| sku | No | SKU of the product. | |
| price | No | Patch the product's single price - top-level fields you omit keep their value, but `recurring` and `paymentPlan` are replaced whole: omitted sub-fields are not kept (interval defaults to month, intervalCount to 1, and trialPeriodDays, billingCycleAnchorConfig and startDate are dropped), so read the current config with `get_product` and re-send it in full when touching either. Valid only while the product has at most one price; products with multiple prices must be updated through `prices[]`. Ignored when `prices` is also sent. `billingType` and `payWhatYouWant` are fixed once a price exists. Cannot be null. | |
| stock | No | Available stock of the product. | |
| title | No | Product title. | |
| prices | No | Replaces the full price list. Read the current prices with `get_product` first and include `id` on every price you want to keep; entries without an id are created and existing prices missing from the list are removed. At least one entry must be enabled. `billingType` and `payWhatYouWant` cannot change on an existing price. Takes precedence over `price` when both are sent. | |
| fileIds | No | ||
| taxCode | No | If Stripe Tax is enabled, determines the tax code used when calculating tax. Defaults to your Stripe Tax settings. | |
| imageIds | No | Replaces the product images with these image file IDs (upload with `upload_file`). Send `[]` to remove all images; null is not accepted. | |
| variants | No | Replaces the full variant list; nothing is merged from the stored variants. Read the current variants with `get_product` first and include `id` on every variant and option you want to keep; entries without an id are created and existing ones missing from the list are removed. Send `[]` to remove all variants. Three fields do not round-trip from `get_product`: re-send each option image as `imageId: option.image.fileId` or it is dropped; option `discountedFromPrice` is not returned at all, so re-supply it or it is lost; and an option returned with `type: "pay_what_you_want"` must be sent back as `type: "one_time"` with `payWhatYouWant: true`. To link a discount to specific options, give those options a `key` and reference it in `discounts[].variantOptionIds[].key` in the same request. | |
| discounts | No | Bulk discounts for the product. Use `checkout_quantity` when the discount should apply to the total checkout quantity. Use `variant_option_quantity` when the discount should apply only to specific variant options. In that mode, you must do all of the following in the same request: 1. Include `productData.variants`. 2. Give each target variant option a temporary `key` in `variants[].options[].key`. 3. Reference those exact keys in `discounts[].variantOptionIds[].key`. - `variants[].options`: [{ name: "Red", key: "red" }, { name: "Blue", key: "blue" }] - `discounts`: [{ quantityCondition: "variant_option_quantity", variantOptionIds: [{ key: "red" }, { key: "blue" }], minQuantity: 3, percentOff: 10 }] [Learn more](https://checkoutpage.com/docs/articles/bulk-discounts) | |
| productId | Yes | The ID of the product to update. Find it on a page response as `data.product.id` (see `get_checkout_page`). | |
| description | No | Description of the product. Accepts HTML or plain text. | |
| pricePicker | No | Price picker settings: the heading and description above the options, Show more / less, and tab labels, defaults and order. | |
| taxBehavior | No | If Stripe Tax is enabled, determines the behaviour of Stripe Tax. Defaults to your Stripe Tax settings. | |
| limitPayments | No | Duplicate-payment prevention settings for this product. Applies to one-time payments only. | |
| defaultPriceId | No | ID of the price pre-selected at checkout. Must reference an existing price `id` (after this update is applied). Cannot be cleared; set a different price instead. | |
| fixedTaxRateIds | No | Tax Rate IDs applied to this product (at most one). Send `[]` to clear; null is not accepted. Call `list_tax_rates` to find an existing rate. | |
| variantsRequired | No | Use when no variants are marked as required but you still need the customer to select at least one variant option. Ignored when any variant is individually required. Defaults to `false`. | |
| hasUnlimitedStock | No | Whether or not the stock of the product is unlimited. If set to `true`, the `stock` field is ignored. | |
| limitSubscriptions | No | Configuration to limit the number of active subscriptions for this product. Used to cap subscriptions to a specific number. | |
| generateLicenseKeys | No | If true, on purchase a license key for the product is generated | |
| enableFileAccessForInactiveSubscriptions | No | Allow customers with inactive subscriptions to keep accessing file downloads. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds genuinely new context: only supplied fields change, prices[]/variants[] are wholesale replacements, the change is immediate across every page selling the product, and there is no undo. The only gap is it doesn't flag that productId must resolve to an existing product, but the safety profile is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, zero filler, front-loaded with purpose then routing then mutation semantics. Every sentence carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations already cover returns and safety, so the description only needs behavioral framing — which it supplies via patch/replace rules, cross-page propagation, immediacy, and irreversibility. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 95%, so the schema already documents nearly every parameter; per the rubric the baseline is 3. The description adds cross-field semantics not obvious from the schema — patch vs replace behavior and the recommendation to read current values first — which earns the bump to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update an existing product') and enumerates the field groups affected (prices, variants, stock, tax, files). It explicitly distinguishes itself from the sibling update_checkout_page by claiming pricing ownership ('this is where a page's pricing lives').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Directly routes the agent: use this, not update_checkout_page, to change what a page sells, and points to get_product for reading current values before a replacement-style update. Names both the alternative and the prerequisite read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_themeADestructiveInspect
Change a theme you created. Every page using it changes too. Keys left out of variables keep their value; null resets. Built-in themes are read-only: copy one with create_theme and baseThemeId.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Theme name, unique within your account. | |
| themeId | Yes | The theme ID, as returned by list or create. | |
| variables | No | Design and labels to set, in the same shape as a page's `themeOverrides`. Keys you leave out keep their value, and `null` resets a property, or everything under a key. Order bump styling, which only the dashboard can change, is kept. Call `list_theme_properties` for the supported properties. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a destructive, non-read-only write. The description adds the real blast radius ('Every page using it changes too') plus partial-update semantics (omitted keys preserved, null resets) and a preservation guarantee ('Order bump styling... is kept'), all beyond what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each carrying distinct information (scope, side effect, merge semantics, read-only constraint), with the primary constraint and consequence front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with an output schema and full annotation coverage, the description covers scope, side effects, partial-update behavior, and the read-only fallback. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents themeId, name, and variables. The description restates the merge/null-reset semantics that the variables schema description already spells out, adding no syntax or format detail beyond it; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change a theme') and scopes it ('you created'), which cleanly separates it from create_theme, get_theme, and delete_theme. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when this tool cannot be used ('Built-in themes are read-only') and names the alternative path for that case ('copy one with create_theme and baseThemeId'). That is a when-not plus a concrete alternative, which is the strongest form of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ticketADestructiveInspect
Update the attendee details (name and email) and metadata held on one event ticket. Use list_tickets first to discover the ticket ID by attendee name, email, or ticket short ID. Only supplied fields change, the booking and customer records are untouched, and the booking ticket PDF is regenerated when attendee details change. Metadata operations are per-entry: a value adds or overwrites its key, null deletes it, other entries survive. Mutating - confirm the target ticket before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| metadata | No | Per-entry metadata operations, matching the ticket validation endpoint: each entry adds or overwrites its key, `null` deletes it, and entries not named are left untouched. A ticket holds at most 20 entries. Door staff also write metadata during check-in, so avoid replace-everything sync patterns. | |
| ticketId | Yes | The ID of the ticket to update. Use `list_tickets` first if you need to discover the ticket ID by attendee name, email, or ticket short ID. | |
| attendeeName | No | Attendee name held on the ticket. Shown on the ticket PDF and the guest list. Send `null` to clear. | |
| attendeeEmail | No | Attendee email held on the ticket. Trimmed and lowercased before storage. Cannot be cleared via this endpoint. Changing it does not affect the booking or customer records. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as mutating (readOnlyHint=false, destructiveHint=true), and the description goes well beyond that: only supplied fields change, booking and customer records are untouched, the booking ticket PDF is regenerated on attendee changes, and metadata is merged per-entry rather than replaced. It also discloses that a null name clears while email cannot be cleared at all.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all carrying operational weight, with the purpose front-loaded before the list_tickets prerequisite. Slightly dense, and the metadata merge rule is stated twice (once in prose, once in the schema), but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a 4-param mutation tool the description covers prerequisites, side effects (PDF regeneration, untouched booking/customer records), merge-vs-replace semantics, and the concurrent-writer caveat. Nothing an agent needs before invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so null-deletion semantics, key/value limits, and email normalization are already documented in the schema. The description largely restates those rules (null deletes a metadata key, null clears the name) rather than adding new semantics. Baseline 3 applies when the schema carries the parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) plus the bounded resource (attendee name/email and metadata on one event ticket) and the scope of what it does not touch. An agent can separate it from update_ticket_type, update_customer, or update_event without opening a schema. The 'one event ticket' framing makes the unit of work unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the discovery path explicitly ('use `list_tickets` first to discover the ticket ID by attendee name, email, or ticket short ID'), which is the practical blocker for calling this tool. It also adds a caution ('confirm the target ticket before calling') and a real operational exclusion ('avoid replace-everything sync patterns' because door staff also write metadata).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ticket_typeADestructiveInspect
Update one ticket type on an event: name, price, capacity, sale window, visibility and more, or move it to another ticket group with moveToTicketGroupId. Only supplied properties change. Get the event, group and ticket type IDs from get_event. Mutating.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| price | No | ||
| hidden | No | ||
| pageId | Yes | The ID of the event. Event IDs come from list_events, or the `id` that create_event returns. | |
| status | No | ||
| imageId | No | ID of an image file for the ticket type, uploaded with `upload_file` (purpose `image`). Pass null to remove the current image. | |
| pricing | No | ||
| capacity | No | ||
| feeAmount | No | ||
| reference | No | ||
| saleEndOn | No | ||
| description | No | ||
| maxQuantity | No | ||
| minQuantity | No | ||
| saleStartOn | No | ||
| ticketTypeId | Yes | The ID of the ticket type. get_event lists each group's ticket types under `ticketGroups[].ticketTypes[].id`. | |
| ticketGroupId | Yes | The ID of the ticket group the ticket type is in now, from `ticketGroups[].id` in get_event. This does not move it: use moveToTicketGroupId for that. | |
| hideWhenSoldOut | No | ||
| hideWhenNotOnSale | No | ||
| hideWhenScheduled | No | ||
| pwywSuggestedPrice | No | ||
| discountedFromPrice | No | ||
| hideWhenUnavailable | No | ||
| moveToTicketGroupId | No | The ID of another ticket group on the same event to move the ticket type to, from `ticketGroups[].id` in get_event. The move happens before the other changes. A ticket type that has sold tickets cannot be moved. | |
| showTicketSaleDates | No | ||
| triggerTicketTypeId | No | ID of another ticket type on the same event whose sale end or sell-out makes this one available. Required when `availabilityBehavior` is `after_ticket_sale_ends`, `after_ticket_sold_out` or `after_ticket_ends_or_sold_out`. Find it under `ticketGroups[].ticketTypes[].id` in get_event. Pass null to remove the trigger. | |
| availabilityBehavior | No | ||
| showAvailableQuantity | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered; the description's 'Mutating.' merely confirms it. The added value is the PATCH semantic 'Only supplied properties change,' which tells the agent omitted fields are left untouched — a genuinely useful behavioral disclosure beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and scope, then prerequisites, then the mutation note — four short clauses with no filler. The trailing 'Mutating.' is nearly redundant against destructiveHint/readOnlyHint annotations, a minor cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers purpose, ID sourcing, partial update and the move case. For a 28-parameter mutation tool it still omits the semantics of the large optional surface (pricing modes, availability behavior, quantity limits), leaving an agent to infer them from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 28 parameters and only 21% schema description coverage, the description would need to compensate heavily, but it names only a handful (name, price, capacity, sale window, visibility, moveToTicketGroupId). Fields like pricing, availabilityBehavior, triggerTicketTypeId, feeAmount, minQuantity/maxQuantity and the hideWhen* family are left unexplained by the description, though some carry their own schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update one ticket type on an event') and enumerates the changeable surface (name, price, capacity, sale window, visibility) plus the distinct move operation. It is clearly separable from create_ticket_type and archive_ticket_type without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite path: 'Get the event, group and ticket type IDs from get_event,' naming a sibling tool as the source of required IDs. It does not explicitly contrast with create_ticket_type or archive_ticket_type, but the update-vs-create/archive distinction is self-evident from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_webhookADestructiveInspect
Update a webhook's name, https URL, subscribed events or status (active/inactive to pause and resume). Only supplied fields change; events are replaced wholesale. Custom headers cannot be set here: they usually hold receiver credentials, so never ask the user for header values and give them the dashboardUrl from the response instead, where headers are edited. Existing headers are kept and their values are returned as [hidden]. Mutating; use list_webhooks to find the id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The https URL Checkout Page POSTs event payloads to. Plain http is rejected. | |
| name | No | Internal label for the endpoint, shown in the dashboard. | |
| events | No | Events this endpoint receives. At least one is required; duplicates are ignored. | |
| status | No | Set `inactive` to pause deliveries without deleting the endpoint, `active` to resume. `failed` is system-managed and cannot be set. | |
| webhookId | Yes | The webhook to update. Use list_webhooks to find the id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, and the description adds genuinely new context: only supplied fields change, events are replaced wholesale, headers cannot be set here, existing headers are preserved and returned as [hidden]. That explains the blast radius of the destructive mutation and the credential-handling constraint, well beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense paragraph with the purpose front-loaded and every clause carrying information (partial-update semantics, wholesale event replacement, header restriction, id lookup). It is longer than average but not padded; a light structural break would help readability without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be spelled out, and the description still flags the relevant response element (dashboardUrl). For a destructive, open-world mutation with five parameters, the description covers scope, side effects, and the credential pitfall, leaving nothing an agent needs to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not: events are replaced wholesale rather than merged, and status inactive pauses deliveries while active resumes them. This meaningfully clarifies update behavior of two parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource plus the exact updatable fields ("Update a webhook's name, https URL, subscribed events or status"), and it names list_webhooks as the way to obtain the id. An agent can distinguish this from create_webhook, delete_webhook and get_webhook without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the mutating nature, directs the agent to list_webhooks for the id, and gives a strong negative instruction: never ask the user for header values and instead hand back the response's dashboardUrl. It stops short of an explicit when-not-to-use rule or a named alternative for header editing beyond the dashboard pointer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileAInspect
Upload a file into your Checkout Page account from a public URL.
Use this tool when you need a Checkout Page file ID to reference elsewhere in the API. The tool fetches the source file from url, uploads it to Checkout Page, and returns the stored file record.
Purpose matters:
purpose: "image"uploads a public image asset. Use this for page galleries, product galleries, ticket visuals, logos, hero images, and other media shown on the page.purpose: "file"uploads a private downloadable asset. Use this for digital downloads attached to checkout pages, files restricted to certain product variants, and files delivered after a form submission.
How uploaded files are typically used:
Page gallery images on checkout pages, events or forms.
Product gallery images and variant-specific images
Ticket types where an image is needed
Downloadable files attached to products or checkout pages after purchase or forms after submission.
Input notes:
urlMUST be a public URL. The MCP server will make a http request to directly download the resource.filenameis optional and overrides the stored filename.Images uploaded as
purpose: "image"must still be a supported image type upstream.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL of the file to fetch and upload into Checkout Page. The MCP tool downloads the file from this URL, then sends it to the Upload File API. | |
| purpose | No | Use `image` for public display assets such as page galleries, product galleries, ticket visuals, or similar media. Use `file` for private downloadable assets such as PDFs, digital downloads, or post-submission form downloads. | image |
| filename | No | Optional filename override. If omitted, the tool derives a name from the source URL when possible. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds useful behavior beyond annotations: the MCP server makes an HTTP request to download the resource from the public URL, filename can override the stored name, and image uploads must be supported upstream. Annotations already cover safety (readOnlyHint=false, destructiveHint=false, openWorldHint=true), but the description omits auth, rate-limit, or idempotency details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action well, but the 'Purpose matters' section, the 'How uploaded files are typically used' list, and the 'Input notes' repeat much of the schema and each other. Sections like the typical-usage list add bulk without much new selection value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and annotations, the description is complete enough: it covers the source URL requirement, purpose semantics, filename override, and typical usage. Return values and safety profile are handled by structured fields, so no critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, purpose, and filename. The description reinforces the public URL requirement and purpose values but does not add parameter semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Upload a file into your Checkout Page account from a public URL.' It also clarifies the outcome ('returns the stored file record') and when a Checkout Page file ID is needed, making it easy to distinguish from the create_* and update_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly says when to use it: 'Use this tool when you need a Checkout Page file ID to reference elsewhere in the API.' It also explains the two purpose modes and their use cases, but it does not name alternative tools or explicit when-not conditions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
58 tool updates
- First observed
add_to_website - First observed
archive_ticket_type - First observed
create_booking - First observed
create_checkout_page - First observed
create_coupon - First observed
create_event - First observed
create_field - First observed
create_form - First observed
create_tax_rate - First observed
create_theme - First observed
create_ticket_type - First observed
create_webhook - First observed
delete_field - First observed
delete_theme - First observed
delete_webhook - First observed
get_booking - First observed
get_checkout_page - First observed
get_customer - First observed
get_event - First observed
get_form - First observed
get_invoice - First observed
get_payment - First observed
get_product - First observed
get_submission - First observed
get_subscription - First observed
get_subscription_payment - First observed
get_theme - First observed
get_webhook - First observed
list_bookings - First observed
list_checkout_pages - First observed
list_coupons - First observed
list_customers - First observed
list_events - First observed
list_forms - First observed
list_invoices - First observed
list_payments - First observed
list_submissions - First observed
list_subscription_payments - First observed
list_subscriptions - First observed
list_tax_rates - First observed
list_theme_properties - First observed
list_themes - First observed
list_tickets - First observed
list_webhooks - First observed
prepare_subscription_cancellation - First observed
regenerate_invoice - First observed
update_checkout_page - First observed
update_coupon - First observed
update_customer - First observed
update_event - First observed
update_field - First observed
update_form - First observed
update_product - First observed
update_theme - First observed
update_ticket - First observed
update_ticket_type - First observed
update_webhook - First observed
upload_file
Publisher details
- Operator
- Checkout Page Technologies, Inc. · Publisher source
- Operator website
- https://checkoutpage.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://checkoutpage.com/docs/build/mcp · Publisher source
- Trust center
- https://checkoutpage.com/security · Publisher source
- Restrictions
- Requires a Checkout Page account (a free plan is available). Taking payments requires connecting your own Stripe account. · Publisher source
Related MCP Connectors
Read payment settings, orders and receipts, create payment links and API keys.
Event ticketing: create and publish events, read orders, attendees and sales analytics.
1Merchant of record: payment links, checkouts, subscriptions and invoices, with VAT handled.
Read subscriptions, customers, charges, orders; skip charges, cancel or activate subscriptions.
Related MCP Servers
- AlicenseBqualityDmaintenanceIntegrates with Lemon Squeezy to manage subscriptions, checkouts, products, orders, customers, license keys, and webhooks programmatically with audit logging capabilities.1710MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI coding agents to set up crypto checkout integration by registering workspaces, creating paylinks and public payment invoices, configuring webhook endpoints, verifying webhook signatures, and checking stablecoin payment status.-

Conekta MCP Serverofficial
FlicenseAqualityDmaintenanceEnables interaction with the Conekta payment API to manage orders, customers, subscriptions, and financial transactions. It provides a comprehensive suite of tools for core payment operations like processing refunds, creating checkouts, and monitoring account balances.322-- AlicenseAqualityAmaintenanceMerchant of record MCP server: create products, payment links, checkouts, subscriptions, invoices and discount codes, with VAT and sales tax handled in 135+ jurisdictions.43114 npm4Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.