Skip to main content
Glama

Server Details

South Africa's first AI-transactable blinds, shutters and awnings catalogue with live ZAR pricing.

Ownership verified
Status
Healthy
Uptime
99.4% over 73 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
Repository
CustomBlinds/cb-shop-mcp
GitHub Stars
0
Server Listing
Custom Blinds Shop MCP

TDQS

A3.9/5.0

Scored across 26 tools

Disambiguation3/5

The descriptions do a good job of signposting legacy vs preferred paths, but the surface still contains three discovery tools (search_catalog, lookup_catalog, legacy search_products) and two ordering paths (create_cart→create_checkout→complete_checkout vs legacy create_order/submit_enquiry) with overlapping purpose. An agent must read carefully to avoid misselection between get_price, get_product, and configure_product, all of which touch colour/stock/pricing.

Naming Consistency5/5

Nearly every tool follows a clean verb_noun snake_case pattern (create_cart, get_checkout, request_swatch, update_cart). The few different verbs (lookup_ vs search_) are still consistent in form and reflect genuine distinctions. No camelCase or stylistic mixing.

Tool Count3/5

26 tools is on the heavy side for a single-shop checkout surface, and the count is inflated by deprecated tools (search_products, create_order, submit_enquiry) retained for backward compatibility. The core flow could be expressed in roughly half the tools.

Completeness4/5

Coverage is broad and coherent: discovery, pricing, configuration, cart/checkout lifecycle, payment methods, order status, delivery estimates, human handoff, swatches, and price matching. Minor gaps exist around post-purchase order changes or cancellations, but the primary purchase lifecycle is well covered.

Available Tools

26 tools
cancel_cartA
Destructive
Inspect

Permanently delete a cart by cart_id. Use when the customer abandons the session or wants to start over. Has no effect on any checkout or paid order already created from this cart. Irreversible, create a new cart to restart.

NameRequiredDescriptionDefault
cart_idYescart_id returned by create_cart.

Output Schema

NameRequiredDescription
cart_idYes
cancelledYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation/safety profile is covered by structured data. The description does add real value beyond them by scoping the blast radius ("no effect on any checkout or paid order already created from this cart") and stating irreversibility — but it gives no guidance on permissions, failure modes, or whether a cancelled cart remains visible in get_cart.

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

Conciseness5/5

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

Three short sentences, front-loaded with the verb and key, then usage, then consequence. Nothing is redundant and every sentence carries distinct information.

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

Completeness4/5

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

With an output schema present, no return-value explanation is needed, and annotations cover the safety profile. The description is nearly complete for a single-parameter destructive tool, lacking only error/idempotency behavior for repeat calls.

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

Parameters3/5

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

Only one parameter with 100% schema description coverage, which already explains cart_id comes from create_cart. The description restates the keying by cart_id but adds no format, validation, or edge-case semantics (e.g. what happens with an already-deleted or already-converted cart).

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

Purpose5/5

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

States a specific verb and resource ("Permanently delete a cart by cart_id") and pre-empts the misleadingly soft name "cancel" by clarifying the operation is a hard delete. An agent can distinguish it from update_cart and create_cart 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.

Usage Guidelines4/5

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

Gives concrete triggers ("customer abandons the session or wants to start over") and points at create_cart as the restart path. It stops short of an explicit "do not use this to modify a cart — use update_cart instead" exclusion, so the negative case is only implied.

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

cancel_checkoutA
Destructive
Inspect

Abort an unpaid checkout and release its checkout_id. Use if the customer changes their mind after create_checkout but before completing payment. Has no effect on orders already confirmed by webhook. To restart, create a new cart and checkout from scratch.

NameRequiredDescriptionDefault
checkout_idYescheckout_id returned by create_checkout.

Output Schema

NameRequiredDescription
statusYes
checkout_idYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false; the description earns credit by adding that the checkout_id is released, that the call is a no-op on webhook-confirmed orders, and that recovery requires a fresh cart. It does not state idempotency (re-cancelling an already-cancelled checkout) or auth requirements.

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

Conciseness5/5

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

Four short sentences, each doing distinct work: action, trigger, no-op boundary, recovery path. The action is front-loaded with no filler.

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

Completeness5/5

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

Output schema exists, so return values need no explanation; the tool takes one required param and the description covers trigger, effect on the resource, no-op case, and how to restart. An agent has everything needed to call this destructively and correctly.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter already documents itself as 'checkout_id returned by create_checkout'; the description merely echoes that provenance. Baseline 3 applies when the schema fully carries parameter semantics.

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

Purpose4/5

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

States a specific verb+resource ('Abort an unpaid checkout') and adds the lifecycle position (after create_checkout, before payment), which makes the operation concrete. It never mentions the sibling cancel_cart, so the checkout-vs-cart distinction is left implicit as the only sibling differentiation gap.

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

Usage Guidelines4/5

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

Gives clear triggering context ('Use if the customer changes their mind after create_checkout but before completing payment') and a boundary condition ('Has no effect on orders already confirmed by webhook'). It also names the recovery path (new cart and checkout from scratch), but offers no guidance against cancel_cart for cart-level aborts.

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

check_colour_stockA
Read-only
Inspect

Verify whether a specific colour is available before configure_product. Returns in_stock boolean, expected_restock_date if out of stock, and up to 5 alternative in-stock colours ordered by similarity. Call this when a customer requests a named colour or when you want to prevent a configure_product failure due to an out-of-stock selection.

NameRequiredDescriptionDefault
product_idYesproduct_id from search_catalog or lookup_catalog.
colour_nameYesColour name to check, e.g. "White".

Output Schema

NameRequiredDescription
foundNo
colourNo
messageNo
in_stockYes
product_idNo
expected_restockNo
matching_coloursNo
available_coloursNo
exact_colour_matchNo
requires_exact_colour_selectionNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered, and the description adds real behavioral detail: a boolean result, a restock date on failure, and a capped, similarity-ordered alternative list. It does not discuss matching semantics (e.g. case sensitivity, fuzzy vs exact colour names), which is the one behavior an agent might still need.

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

Conciseness5/5

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

Three sentences, front-loaded with the core purpose and followed by return shape and call conditions. No filler or restatement of the tool name.

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

Completeness4/5

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 explain intent and timing, which it does. Minor gaps remain around colour-name matching rules and what happens with an unrecognized colour name.

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

Parameters3/5

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

Schema coverage is 100% and both parameters carry their own descriptions, including the provenance hint for product_id. The description adds no additional parameter meaning beyond what the schema already provides, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource — verify whether a colour is in stock — and ties it to a concrete workflow (before configure_product). It is clearly distinguishable from catalog/search siblings because it checks stock rather than retrieving product data.

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

Usage Guidelines5/5

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

Explicitly names the trigger conditions: a customer requesting a named colour, or wanting to avoid a configure_product failure from an out-of-stock selection. The alternative (configure_product) and the ordering relationship between the two tools are spelled out rather than inferred.

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

complete_checkoutA
Destructive
Inspect

Generate a Yoco card or Ozow instant-EFT payment link; this does NOT complete payment. Rejects cancelled checkouts and rechecks stock and totals first. An atomic claim prevents competing gateway calls. Returns payment_url or null plus status and message; cloud callers may be held. Retain a successful URL: repeat calls return payment_pending with no URL. Gateway failures raise an error, send no payment-link email and require team review rather than an automatic retry. Poll get_order with customer_email for payment status.

NameRequiredDescriptionDefault
checkout_idYescheckout_id returned by create_checkout.
payment_methodNoOverrides any value set in create_checkout/update_checkout

Output Schema

NameRequiredDescription
ap2No
itemsNo
statusYes
messageYes
currencyNo
customerNo
next_stepNo
total_zarNo
item_countNo
checkout_idYes
payment_urlYes
payment_methodNo
provider_referenceNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and destructiveHint=true; the description goes far beyond by disclosing the stock/total recheck, the atomic claim blocking competing gateway calls, that cloud callers may be held, the exact return shape (payment_url or null plus status/message), and the failure contract (error raised, no payment-link email, no automatic retry). That is precisely the operational context annotations cannot express.

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

Conciseness5/5

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

Five short sentences, each carrying a distinct fact: what it does, the non-completion caveat, preconditions, concurrency behavior, return contract, and the retry/polling policy. The non-completion correction is front-loaded right after the purpose where it matters most.

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

Completeness5/5

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

This is a claim-holding, financially consequential operation and the description covers preconditions, concurrency, return values, failure handling, and the follow-up polling step. Even though an output schema exists, the idempotency warning about retaining a successful URL is essential and is supplied here.

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

Parameters3/5

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

Schema coverage is 100% and both parameters are documented inline (checkout_id provenance, payment_method override behavior), so the description need not repeat them. It adds no further semantics about checkout_id or how the payment_method enum interacts with prior configuration, leaving it at the baseline for a fully-covered schema.

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

Purpose5/5

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

States a specific verb and resource ('Generate a Yoco card or Ozow instant-EFT payment link') and explicitly bounds scope with 'this does NOT complete payment', which separates it from anything an agent might assume about checkout finalization. Gateway options are named, so an agent knows what it gets 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.

Usage Guidelines5/5

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

Gives concrete when/when-not rules: rejected for cancelled checkouts, and on gateway failure the agent must escalate rather than auto-retry. It also routes the agent to the correct sibling for the next step ('Poll get_order with customer_email for payment status') and warns against re-calling by explaining that repeats return payment_pending with no URL.

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

configure_productA
Read-only
Inspect

Lock in a full blind specification: product, dimensions, colour, and mount type (inside recess or outside face-fix). Validates that the colour exists and is in stock, then prices the blind. Returns a configuration summary to pass directly into create_cart. Call check_colour_stock first if availability is uncertain.

NameRequiredDescriptionDefault
colourYesColour name (must match available colours)
finishNoOptional finish for aluminium venetians
provinceNoOptional. Customer's South African province or city. Garden Route locations get Duncan's direct contact; other locations get the online shop contact.
quantityNoNumber of blinds (default 1)
width_mmYesWidth in millimetres
height_mmYesHeight/drop in millimetres
mount_typeYesUse inside (recess) or outside (face-fix); handler requires a nonempty value
product_idYesproduct_id from search_catalog or lookup_catalog

Output Schema

NameRequiredDescription
colourYes
finishNo
limitsNo
contactNo
summaryNo
currencyYes
deliveryNo
in_stockNo
quantityYes
width_mmYes
height_mmYes
lead_timeNo
next_stepNo
price_zarNo
mount_typeYes
product_idYes
product_nameNo
vat_includedNo
unit_price_zarYes
total_price_zarYes
effective_width_mmNo
effective_height_mmNo
minimum_charge_appliedNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description is consistent with that: it validates colour existence and stock, prices the blind, and returns a summary rather than persisting a cart. It adds real behavioural detail beyond the annotation (validation happens, pricing is computed, output is a handoff artefact), though it does not say whether repeat calls recompute or cache, or what happens when validation fails.

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

Conciseness5/5

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

Four short sentences, front-loaded with the specification scope, followed by behaviour, output destination, and the prerequisite check. No sentence is redundant and each earns its place.

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

Completeness4/5

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 the validation, pricing and handoff semantics that the schema cannot. Minor gap: it does not mention that the optional province parameter alters which contact appears in the result, which is a meaningful side effect for an agent assembling the response.

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

Parameters4/5

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 meaning beyond the schema by disambiguating mount_type into 'inside recess or outside face-fix' — a string parameter with no enum, where the schema's own note is only about nonemptiness. It stops short of covering the optional finish, province and quantity parameters.

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

Purpose5/5

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

States a specific verb and resource: locks in a blind specification covering product, dimensions, colour and mount type, then validates and prices it. The boundary with create_cart is made explicit by describing the output as something to 'pass directly into create_cart', so an agent can distinguish the two 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.

Usage Guidelines5/5

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

Gives explicit sequencing guidance: call check_colour_stock first if availability is uncertain, and pass the returned summary into create_cart. Both the predecessor and successor tools are named with the condition that selects them, 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.

create_cartAInspect

Start the open UCP purchase flow, no auth needed. Creates a cart session and returns a cart_id (24-hour TTL). Optionally seed with pre-configured blind items and customer details. Next step: update_cart to add items, then create_checkout → complete_checkout to mint the payment link.

NameRequiredDescriptionDefault
itemsNoOptional configured items; all submitted prices are ignored
customerNoOptional customer details (name, email, phone, address, city).

Output Schema

NameRequiredDescription
itemsYes
cart_idYes
currencyYes
customerYes
total_zarYes
created_atYes
expires_atYes
item_countYes
updated_atYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only say readOnlyHint=false and destructiveHint=false; the description adds genuinely new behavior: no auth is required, the returned cart_id expires after 24 hours, and seeding with items/customer details is optional. It does not cover failure modes (e.g., invalid colour or product_id) or whether a cart can be re-seeded, so it is good but not complete.

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

Conciseness5/5

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

Three short sentences: what it does, what it returns with its TTL, and the workflow it belongs to. The workflow pointer is last where it belongs, and no sentence is filler.

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

Completeness5/5

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

With an output schema present, return values are covered by structure, yet the description still surfaces the one thing an agent must know (cart_id and its 24-hour expiry) plus auth and workflow position. For a 2-param nested-object tool, that is sufficient to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and every nested field is documented, including the unusual 'prices are ignored, server recalculates' rule. The description only restates that items and customer details are optional seeds, adding little 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.

Purpose5/5

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

States a concrete verb and resource ('Creates a cart session') plus the concrete return value ('cart_id (24-hour TTL)'), and frames it as the entry point of the purchase flow. An agent can distinguish it from siblings like get_cart or update_cart 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.

Usage Guidelines4/5

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

Explicitly routes the agent forward ('Next step: update_cart to add items, then create_checkout → complete_checkout'), which is the key sequencing decision for this tool family. It does not state when not to use it (e.g., to resume an existing cart use get_cart), so it stops short of full alternative coverage.

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

create_checkoutA
Destructive
Inspect

Phase 1 of 2 in the purchase flow. Convert a cart (or inline items + customer) into a checkout. Customer name, email, and phone are required. Returns checkout_id. No payment link is minted yet, call complete_checkout for that. Use update_checkout to correct customer details before finalising.

NameRequiredDescriptionDefault
itemsNoLine items to buy. Required if cart_id is not given.
cart_idNoEither cart_id or items required
customerNoCustomer details. Name, email, mobile phone and delivery address are required; city is optional. Placeholder or test details are refused.
payment_methodNoDefault 'yoco'

Output Schema

NameRequiredDescription
ap2No
itemsNo
statusYes
messageNo
currencyYes
customerNo
next_stepNo
total_zarYes
item_countNo
checkout_idYes
payment_urlNo
payment_methodNo
provider_referenceNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation signal is covered. The description adds genuinely useful context beyond that — no payment link is minted at this stage — but is silent on side effects an agent would want to know: whether stock is reserved or held, whether the checkout expires, and whether cancel_checkout is the recovery path for a mistake.

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

Conciseness4/5

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

Front-loaded with the phase and the core action, and each sentence carries routing or prerequisite information. Minor redundancy in restating the required customer fields, which the schema already marks required.

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

Completeness4/5

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

An output schema exists and checkout_id is named anyway; the two-step flow and the correction path are covered. For a tool this complex (nested items, server-side repricing), missing notes on stock reservation and checkout lifetime keep it short of full completeness.

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

Parameters3/5

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

Schema coverage is 100% and the nested items/customer schemas are richly documented, so the baseline applies. The only added semantics — that name, email and phone are required — restates constraints the schema already encodes, and the cart_id-vs-items exclusivity is not clarified further than the schema's anyOf.

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

Purpose5/5

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

States a specific verb and resource ("Convert a cart ... into a checkout") and pins its position in the flow as "Phase 1 of 2 in the purchase flow". It also explicitly distinguishes itself from complete_checkout (payment link) and update_checkout (correcting details), so an agent can place it without opening siblings.

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

Usage Guidelines5/5

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

Names the alternatives and the conditions that select them: call complete_checkout to mint the payment link, call update_checkout to fix customer details before finalising. The prerequisite (customer name/email/phone required) is also stated, leaving little to inference.

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

create_orderA
Destructive
Inspect

Legacy auth-required tool, prefer the open UCP flow (create_cart → create_checkout → complete_checkout) which needs no credentials. Use create_order only if you hold a Bearer token and want a single-call path to a payment link. All item prices are re-verified server-side against the live pricing engine, agent-supplied prices are ignored. Returns a Yoco or Ozow payment_url.

NameRequiredDescriptionDefault
itemsYesArray of configured blind items
customer_cityNoDelivery city
customer_nameYesCustomer full name
customer_emailYesCustomer email address
customer_phoneYesCustomer phone number
payment_methodNoYoco card or Ozow instant EFTyoco
customer_addressNoDelivery address

Output Schema

NameRequiredDescription
ap2No
itemsNo
statusYes
messageYes
currencyNo
customerNo
next_stepNo
total_zarNo
item_countNo
checkout_idYes
payment_urlYes
payment_methodNo
order_referenceYes
provider_referenceNo

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing the Bearer-token auth requirement, that prices are re-verified server-side and agent-supplied prices are ignored, and what the response contains (payment_url). It does not elaborate on the destructive/mutating consequences flagged by destructiveHint=true (e.g. whether an order can be cancelled afterwards via cancel_cart), so a small gap remains.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the routing decision (legacy vs open flow) and followed by auth, pricing integrity, and return value. No sentence is redundant.

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

Completeness4/5

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

An output schema exists and annotations carry the safety profile, so the description covers the remaining essentials: auth, the preferred alternative, and pricing behaviour. Only minor lifecycle details (what happens to the order if the payment link is abandoned, relation to cancel/ get_order) are absent.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3. The description adds real meaning beyond the schema by telling the agent that unit_price_zar/total_price_zar inputs are ignored in favour of the live pricing engine, which changes how the item parameters should be populated.

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

Purpose5/5

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

States a specific verb+resource (create an order) and pins down the exact output: a single-call path to a Yoco or Ozow payment_url. It also positions itself against the multi-step siblings (create_cart → create_checkout → complete_checkout), so an agent can distinguish 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.

Usage Guidelines5/5

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

Explicit when-to-use and when-not-to-use: prefer the open UCP flow, use this one only if you hold a Bearer token and want a single-call path. The named alternative sequence is unambiguous.

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

get_ar_visualizer_urlA
Read-only
Inspect

Returns the link to the Custom Blinds Visualiser (See it before you buy it), pre-selected to the product when it is supported. The customer adds a photo of their window (any angle), picks a blind and colour, and previews it on their own window. A preview of colour and style, not a measuring tool. No measuring or marking. A name and WhatsApp number are needed; 2 free previews per customer. Also returns the measuring guide (mode 'measure' makes it the main url) and the list of supported products. A customer still unsure of sizes can order with best guess sizes, receive a free tape measure and confirm before production starts. Use when a customer wants to see how a blind or colour will look before ordering, or is unsure how to measure.

NameRequiredDescriptionDefault
modeNoWhich link goes in url: visualize (own-window visualiser), measure (measuring guide) or both (visualiser, the default). Both links are always returned.
product_idNoOptional. Pre-select a product in the visualiser (e.g. roller-blockout, double-roller-zebra, outdoor-blinds).

Output Schema

NameRequiredDescription
urlYes
noteYes
product_idNo
measure_urlYes
visualiser_urlYes
supported_productsNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, and the description adds substantial context beyond that: two free previews per customer, the requirement for a name and WhatsApp number, that both links are always returned, and that unsupported products fall back to ordering with best-guess sizes plus a free tape measure. These are real operational constraints 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.

Conciseness4/5

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

The purpose and scope are front-loaded in the first sentence, and the usage cue is placed last where it is most useful. It loses a point for mild redundancy, since 'not a measuring tool' and 'No measuring or marking' restate the same idea in consecutive sentences.

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

Completeness5/5

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

An output schema exists, so return values need not be described. Given a two-parameter read-only tool, the description covers the product scope, the preview limits, the contact-data prerequisite, and the measuring fallback — everything an agent would need to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description still adds meaning the schema does not spell out plainly: 'both links are always returned' regardless of mode, and that product pre-selection only applies 'when it is supported' with the supported list returned alongside. That extra semantic lift from mode selection earns a 4.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Returns the link to the Custom Blinds Visualiser'), states the pre-selection scope ('pre-selected to the product when it is supported'), and clarifies what the artifact is and is not ('A preview of colour and style, not a measuring tool'). An agent can distinguish this from siblings like get_product_recommendation or request_swatch 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.

Usage Guidelines4/5

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

Usage is explicit: 'Use when a customer wants to see how a blind or colour will look before ordering, or is unsure how to measure,' and the mode enum is explained in terms of which link becomes primary. It doesn't name specific sibling tools as alternatives or state when NOT to call it, but the context is otherwise clear enough to route correctly.

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

get_cartA
Read-only
Inspect

Retrieve live cart state by cart_id: full item list, calculated totals in ZAR, and any customer details stored so far. Call after update_cart to confirm changes are correct before proceeding to create_checkout. Cart expires after 24 hours of inactivity.

NameRequiredDescriptionDefault
cart_idYescart_id returned by create_cart.

Output Schema

NameRequiredDescription
itemsYes
cart_idYes
currencyYes
customerYes
total_zarYes
created_atYes
expires_atYes
item_countYes
updated_atYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds genuinely new context: totals are in ZAR and the cart expires after 24 hours of inactivity, which affects how an agent should handle stale cart_ids. The itemized return contents partly duplicate the output schema, so it falls 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.

Conciseness5/5

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

Three short sentences with zero filler: what it returns first, then when to call it, then the expiry caveat. Front-loaded and every sentence earns its place.

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

Completeness5/5

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

With one fully documented parameter, a readOnlyHint annotation, and an existing output schema, the description only needed to add workflow sequencing and lifecycle behavior, both of which it provides. 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.

Parameters3/5

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

Schema description coverage is 100% and the schema already explains that cart_id comes from create_cart. The description adds no further syntax or format detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Retrieve live cart state by cart_id') and enumerates the returned content: item list, ZAR totals, stored customer details. This is clearly distinguishable from mutating siblings like update_cart and from get_checkout/get_order.

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

Usage Guidelines5/5

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

Explicitly positions the call in the workflow: 'Call after update_cart to confirm changes are correct before proceeding to create_checkout.' It names the preceding and following sibling tools, so the agent knows both when to call it and what it gates.

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

get_checkoutA
Read-only
Inspect

Read checkout by checkout_id. Returns persisted order status, payment_status, payment_method, items, customer, total_zar and currency. Initial order status is started, not pending. This tool does not return a previously generated payment_url: retain the complete_checkout response in caller context.

NameRequiredDescriptionDefault
checkout_idYescheckout_id returned by create_checkout.

Output Schema

NameRequiredDescription
ap2No
itemsNo
statusYes
messageNo
currencyYes
customerNo
next_stepNo
total_zarYes
item_countNo
checkout_idYes
payment_urlNo
payment_methodNo
provider_referenceNo

TDQS

A4.5/5.0
Behavior5/5

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

The description adds important behavior beyond the readOnlyHint annotation: it discloses the exact returned fields, clarifies that initial order status is 'started' rather than 'pending', and warns that payment_url is not retrievable here and must be retained from complete_checkout. These details materially affect how an agent uses the response.

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

Conciseness5/5

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

The description is three tight sentences, front-loaded with the purpose followed by the return contents and two operational caveats. No sentence is wasted, and the important constraints appear before the caller would need to reason about them.

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

Completeness5/5

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

For a simple read tool with an output schema and readOnlyHint annotation, the description supplies the remaining behavioral context an agent needs: returned fields, initial status semantics, and the payment_url retention caveat. Nothing essential for correct invocation is missing.

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

Parameters3/5

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

Schema coverage is 100%, and the single checkout_id parameter is fully documented in the schema as coming from create_checkout. The description repeats that it reads by checkout_id but adds no further syntax or format meaning beyond 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.

Purpose5/5

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

The description states a specific verb and resource: read a checkout by checkout_id. It goes beyond the name by specifying the return payload and distinguishing checkout semantics from order/cart semantics, so an agent can identify the tool's purpose without ambiguity.

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

Usage Guidelines4/5

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

The description gives clear context for using the tool, including the required checkout_id and the caveat that payment_url is not returned, implying the caller should retain the complete_checkout response. It does not explicitly name alternatives such as get_order or get_cart, so it falls short of a full usage-guidance score.

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

get_delivery_estimateA
Read-only
Inspect

Explain the lead time for a new order. Production takes 5 to 7 working days once payment clears, outside peak seasons, then courier transit of about 2 to 5 working days. Returns the ranges and a plain-language summary safe to share. Never quote a dispatch or delivery date: weather and production set them. Call this when a customer asks 'when will it arrive?'.

NameRequiredDescriptionDefault
order_dateNoISO date string of the order placement date (e.g. '2026-05-18'). Defaults to today.

Output Schema

NameRequiredDescription
summaryYes
importantYes
order_dateNo
production_startsNo
expedited_availableNo
delivery_after_dispatchYes
transit_working_days_maxYes
transit_working_days_minYes
production_working_days_maxYes
production_working_days_minYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only disclose readOnlyHint=true, and the description adds substantially more: what the answer contains (ranges plus a shareable plain-language summary), the seasonal caveat ('outside peak seasons'), and a hard guardrail against quoting exact dispatch or delivery dates because weather and production determine them. That is real operational context an agent cannot get from the annotation.

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

Conciseness4/5

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

Four sentences, front-loaded with the substantive lead-time facts before the caveats and the call trigger. Dense and largely waste-free, though the 'plain-language summary safe to share' detail is the only clause that could be trimmed as the output schema already covers return shape.

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

Completeness5/5

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

With an output schema present, return values need no explanation, and the description covers the remaining burden: what is estimated, the ranges' drivers, seasonal exceptions, the guardrail on quoting dates, and the triggering scenario. Nothing an agent needs in order to call and use this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and order_date is fully documented with an ISO example and a 'defaults to today' note. The description adds nothing about the parameter and never mentions that an order date can be supplied, so this sits at the baseline where the schema does all the work.

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

Purpose5/5

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

The first sentence states a specific verb and resource ('Explain the lead time for a new order'), and the scope is disambiguated by naming the contributing stages (production, then courier transit). No sibling tool in the list does delivery estimation, so the agent can identify this immediately.

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

Usage Guidelines4/5

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

It gives an explicit trigger: 'Call this when a customer asks "when will it arrive?"'. It also constrains the answer ('Never quote a dispatch or delivery date'). It stops short of naming a when-not-to-use case or an alternative tool, but no sibling actually competes for this task.

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

get_orderA
Read-only
Inspect

Retrieve a confirmed order's status, items, and payment details by order_id. customer_email is required as soft-auth and must exactly match the order record, prevents arbitrary order lookups. Returns payment status (paid | pending | failed), production status, and dispatch date once available.

NameRequiredDescriptionDefault
order_idYesOrder reference: the checkout_id returned by create_checkout.
customer_emailYesEmail address on the order. Must match the order record (not case-sensitive).

Output Schema

NameRequiredDescription
itemsNo
paid_atNo
currencyYes
order_idYes
lead_timeNo
total_zarYes
order_statusNo
payment_statusYes
order_referenceNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description goes further by disclosing the soft-auth requirement, the exact-match constraint on customer_email, and the security rationale (blocking arbitrary lookups). It also notes dispatch date is only present 'once available', which sets expectations about partial responses. It does not say what error surfaces on a mismatch, keeping it 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.

Conciseness4/5

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

Three tight sentences, front-loaded with the verb and resource, then the auth constraint, then the return shape. The third sentence enumerates return fields despite an output schema existing, which is mildly redundant but still helps the agent interpret partial results.

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

Completeness4/5

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

With an output schema, 100% parameter coverage, and readOnlyHint, the description covers what the structured fields cannot: the auth model and the exact-match rule. It leaves open behavior for non-confirmed or cancelled orders and the failure mode on email mismatch, which are the only real gaps for a 2-param read tool.

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

Parameters4/5

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 semantics beyond the schema: it frames customer_email as an authentication gate rather than a filter, and explains why it is mandatory. Minor tension exists in 'must exactly match' versus the schema's 'not case-sensitive', though the schema resolves it.

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

Purpose4/5

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

States a specific verb and resource ('Retrieve a confirmed order's status, items, and payment details') with a clear key ('by order_id'). It implicitly separates itself from get_checkout/get_cart by scoping to a *confirmed* order, but never names those siblings, so an agent must infer the boundary itself.

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

Usage Guidelines3/5

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

Usage is implied by the 'confirmed order' scope and the note that soft-auth 'prevents arbitrary order lookups', which is a partial when-not condition. There is no explicit routing to get_checkout, get_cart, or create_order, so the agent has no stated rule for choosing this tool over its closest siblings.

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

get_payment_methodsA
Read-only
Inspect

List available payment processors and their capabilities. Returns Yoco (card, immediate) and Ozow (instant EFT via South African bank account). Call when the customer asks 'how can I pay?' or before presenting options. The result informs the payment_method field in create_checkout and complete_checkout.

NameRequiredDescriptionDefault
order_total_zarNoOptional. For future per-handler limit filtering.

Output Schema

NameRequiredDescription
noteYes
handlersYes
default_currencyYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: what is returned (card vs. instant EFT via South African bank account) and how the output feeds create_checkout/complete_checkout. It stops short of mentioning auth or caching/rate behavior, 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.

Conciseness5/5

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

Three short sentences, front-loaded with what the tool returns, then when to call it, then why it matters. Every sentence adds information an agent needs; nothing is redundant with the title or schema.

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

Completeness5/5

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

An output schema exists, so return values need not be re-specified, and the only parameter is optional and fully documented. Purpose, trigger, expected content, and downstream dependency are all present for a simple read-only lookup.

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

Parameters3/5

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

The single optional parameter order_total_zar is not mentioned in the description, but schema description coverage is 100% and the schema itself explains it is reserved for future per-handler limit filtering. With the schema carrying the load, the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("List available payment processors and their capabilities") and even enumerates the concrete return values, Yoco and Ozow. An agent can immediately tell this is the payment-options discovery tool and distinguish it from checkout-mutating siblings like create_checkout.

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

Usage Guidelines4/5

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

Gives an explicit trigger ("Call when the customer asks 'how can I pay?' or before presenting options") and names the downstream tools whose payment_method field depends on the result. It provides clear usage context but no when-not conditions, which is acceptable since no sibling offers an overlapping capability.

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

get_priceA
Read-only
Inspect

Get an exact ZAR price using product_id from search_catalog or lookup_catalog, width_mm and height_mm. Prices include VAT and delivery. Colour selects the bamboo price tier where applicable. A price is not a stock reservation: validate the exact colour and mount with configure_product before creating a cart. Failure can return success:false or a JSON-RPC validation error.

NameRequiredDescriptionDefault
colourNoOptional bamboo colour for colour-specific tier pricing
finishNoOptional finish for aluminium products: Plain, Brushed, Woodgrain
provinceNoOptional. Customer's South African province or city. Garden Route locations get Duncan's direct contact; other locations get the online shop contact.
quantityNoNumber of blinds (default 1)
width_mmYesWidth in millimetres (e.g. 1200)
height_mmYesHeight/drop in millimetres (e.g. 1500)
product_idYesproduct_id from search_catalog or lookup_catalog (e.g. roller-blockout)

Output Schema

NameRequiredDescription
finishNo
limitsNo
contactNo
currencyYes
deliveryNo
quantityYes
width_mmYes
height_mmYes
lead_timeNo
next_stepNo
product_idYes
product_nameNo
vat_includedYes
unit_price_zarYes
total_price_zarYes
effective_width_mmNo
effective_height_mmNo
minimum_charge_appliedNo

TDQS

A4.5/5.0
Behavior4/5

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

Beyond readOnlyHint=true, it discloses that prices include VAT and delivery, that colour can shift the bamboo tier, and that failures can surface as success:false or as a JSON-RPC validation error. That is unusually rich behavioral context, though it does not say whether prices are cached or how often tiers change.

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

Conciseness5/5

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

Four short sentences, front-loaded with the core action and inputs, followed by pricing semantics, a caveat, and error modes. No sentence is filler and each adds a distinct constraint.

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

Completeness5/5

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

An output schema exists, so return values need not be re-explained. The description covers input provenance, pricing semantics, the mutation boundary (not a reservation), the correct next tool, and the failure surface — everything an agent needs before and after calling it.

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

Parameters3/5

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

Schema description coverage is 100%, so all seven parameters are already documented, including the colour-tier and finish semantics. The description echoes the colour-tier behavior and the dimension inputs but adds nothing new about finish, quantity, or the province routing parameter, so it sits at the baseline.

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

Purpose5/5

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

The definition opens with a specific verb plus resource and defines the exact inputs that determine the answer ('Get an exact ZAR price using product_id from search_catalog or lookup_catalog, width_mm and height_mm'). It is clearly separated from siblings like request_price_match and get_product because this is the deterministic, configured-dimension price lookup.

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

Usage Guidelines5/5

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

It names where product_id must come from (search_catalog or lookup_catalog), states the pre-cart validation step via configure_product, and warns that a price is not a stock reservation. That is explicit when-to-use plus a clearly stated follow-up action instead.

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

get_productA
Read-only
Inspect

Fetch complete details for one product by id (e.g. roller-blockout, venetian-25mm-aluwood). Returns all available colours with in-stock status, materials, features, and maximum supported dimensions. Use before configure_product to confirm a colour exists and is in stock before committing.

NameRequiredDescriptionDefault
product_idYesproduct_id from search_catalog or lookup_catalog.

Output Schema

NameRequiredDescription
nameYes
coloursYes
categoryYes
featuresNo
materialsNo
product_idYes
schema_urlNo
descriptionNo
product_urlYes
size_limitsNo
max_width_mmNo
suitable_forNo
max_height_mmNo
installation_typeNo
starting_price_zarNo
colour_count_in_stockNo

TDQS

A4.5/5.0
Behavior4/5

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

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower, but the description still adds substantive payload context: all colours with in-stock status, materials, features, and maximum supported dimensions. It also discloses the intended role as a pre-commit validation step. No permission, rate-limit, or failure-mode notes, which keeps it at 4 rather than 5.

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

Conciseness5/5

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

Three short sentences, each doing distinct work: what it returns, what the payload contains, and when to call it. The action statement is front-loaded and nothing is repeated from the schema.

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

Completeness5/5

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

For a single-parameter read tool with an output schema, an annotation declaring read-only behaviour, and full schema coverage, the description covers access pattern (by id), id format, payload contents, and workflow placement. Nothing an agent needs in order 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.

Parameters4/5

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 documented as coming from search_catalog or lookup_catalog. The description goes beyond that by giving literal example id values, which clarifies the expected slug format. Small but genuine value added on top of the schema.

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

Purpose5/5

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

States a specific verb and resource ("Fetch complete details for one product by id") and immediately grounds it with concrete id examples ("roller-blockout, venetian-25mm-aluwood"). It also implicitly separates itself from the list/search siblings by scoping to a single product, and names the downstream tool it feeds.

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

Usage Guidelines4/5

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

Gives an explicit when-to-use rule: call before configure_product to confirm a colour exists and is in stock before committing. That is a clear conditional trigger rather than vague context. It does not address the near-neighbour alternative check_colour_stock for stock-only queries, 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.

get_product_recommendationA
Read-only
Inspect

Translate a customer's primary concern into a product recommendation. primary_concern must be one of: blockout, heat, glare, moisture, privacy, security, automation. Optionally narrow by room (bedroom, lounge, etc.), location, budget, and aesthetic. Returns a recommended product_id with rationale, pass it to get_price or configure_product next. Security concern routes to brochure MCP (Garden Route customers only).

NameRequiredDescriptionDefault
roomNoOptional room, e.g. "bedroom". Noted in the reply.
locationNoOptional customer city or suburb. Accepted but not currently used.
aestheticNoOptional style preference. Noted in the reply.
max_budget_zarNoOptional budget in ZAR. Drops options whose 1000x1000mm starting price is above it.
primary_concernYesMain need: blockout, heat, glare, moisture, privacy, security or automation. security returns a Garden Route handoff, not shop products.

Output Schema

NameRequiredDescription
notesNo
handoffNo
recommendationsYes

TDQS

A4/5.0
Behavior4/5

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

Consistent with readOnlyHint=true — the wording ('Translate', 'Returns a recommended product_id') describes a pure lookup with no mutation. It adds real context beyond annotations: the security path is a handoff to another MCP rather than a normal result, and budget filtering silently drops products whose 1000x1000mm starting price exceeds the cap. The 'Garden Route customers only' qualifier is useful but vague about what happens to non-Garden-Route security requests.

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

Conciseness5/5

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

Four tight sentences: what it does, valid inputs, optional narrowing, then next steps and the routing exception. The product_id handoff is placed exactly where the agent will look for it after invoking. No filler.

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

Completeness4/5

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

For a read-only, single-required-param tool with a full output schema, this covers purpose, inputs, output handoff and the one exceptional path. The only material gap is how it relates to catalog-search siblings — an agent may still be unsure whether to recommend or search.

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

Parameters3/5

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 carries enum values and per-parameter notes. The description does add the budget mechanism, but its claim that you can 'narrow by ... location' conflicts with the schema's own note that location is 'Accepted but not currently used', which could lead an agent to rely on a filter that does nothing.

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

Purpose4/5

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

Uses a specific verb+resource: 'Translate a customer's primary concern into a product recommendation.' The enumerated concern values make the input space concrete. It stops short of distinguishing itself from catalog siblings like search_products or lookup_catalog, so an agent can't be certain when this beats a catalog search.

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

Usage Guidelines4/5

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

Clear usage context: supply a primary concern, optionally narrow by room/budget/aesthetic, then pass the returned product_id to get_price or configure_product. It also states an exclusion — security concerns route to the brochure MCP for Garden Route customers rather than returning shop products. No comparison against catalog-search siblings is offered.

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

get_whatsapp_handoffA
Read-only
Inspect

Generate a pre-filled WhatsApp deep link to hand the customer off to the right contact. Garden Route locations (Knysna, Plett, George, Sedgefield, etc.) route to Duncan Kane for a free in-home consultation, booked on the same WhatsApp line (+27760228410); all other South African locations route to that line too (+27760228410). It is WhatsApp only, no voice calls. Use when the customer prefers human assistance or when self-serve checkout isn't appropriate.

NameRequiredDescriptionDefault
messageNoOptional additional message to prefill
locationNoCity/suburb. Drives Duncan vs shop routing.
customer_nameNoCustomer's name, used in the prefilled WhatsApp message.
product_contextNoe.g. 'roller blockout for bedroom'

Output Schema

NameRequiredDescription
reasonYes
recipientYes
whatsapp_urlYes
recipient_phoneYes

TDQS

A4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, and the description correctly reinforces that this is a non-mutating link generator while adding real behavioral context: WhatsApp-only channel, no voice calls, and the routing rule. It does not state what happens for locations outside South Africa or when location is omitted, which is a meaningful gap given routing is the tool's core logic.

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

Conciseness3/5

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

The purpose is correctly front-loaded, but the routing sentence is padded and repetitive — the phone number is printed twice and the 'Duncan Kane vs all others' distinction resolves to the same line. That clause consumes space without adding decision value, and the usage sentence is buried at the end.

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

Completeness4/5

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

For a read-only URL generator with an output schema and fully documented parameters, the description covers purpose, channel constraint, and routing intent adequately. The remaining gap is edge-case coverage (missing/unknown location, non-SA customers), which the self-nullifying routing sentence leaves genuinely ambiguous.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description does explain what location drives, but the explanation undercuts itself: both the Garden Route branch and 'all other South African locations' route to the identical number (+27760228410), so an agent cannot tell whether passing location changes anything. The message/customer_name/product_context prefill semantics are left entirely to the schema.

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

Purpose5/5

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

Opens with a concrete verb+resource: 'Generate a pre-filled WhatsApp deep link to hand the customer off to the right contact.' That is unambiguous and distinguishable from siblings like submit_enquiry or complete_checkout, which handle different handoff paths.

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

Usage Guidelines4/5

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

Gives explicit triggering conditions: 'Use when the customer prefers human assistance or when self-serve checkout isn't appropriate.' It does not, however, name the alternative tool (e.g., submit_enquiry) that also represents a human handoff, so the agent must infer which to pick when both could apply.

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

lookup_catalogA
Read-only
Inspect

Preferred structured discovery. Filter by category, partial colour name or required supported width/drop in mm. Returns results containing product_id, name, category and product_url, plus total. Width/drop filters check separate maximums, not every combination; confirm the exact pair with get_price.

NameRequiredDescriptionDefault
colourNoPartial colour name to match, e.g. "white".
categoryNoroller | venetian | honeycomb | vertical | outdoor
max_width_mmNoOnly products that can be made at least this wide, in millimetres. Checked separately from max_height_mm, not as a pair.
max_height_mmNoOnly products that can be made at least this high (drop), in millimetres. Checked separately from max_width_mm; confirm the exact pair with get_price.

Output Schema

NameRequiredDescription
totalYes
resultsYes

TDQS

A4.2/5.0
Behavior5/5

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

Goes well beyond readOnlyHint=true by disclosing the returned fields (product_id, name, category, product_url, total) and, critically, the non-obvious caveat that width/drop filters apply separate maximums rather than a validated pair. It also routes the agent to get_price for exact-pair confirmation, which prevents a real failure mode.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the preference claim, followed by filter coverage and the caveat. Every sentence carries information the agent needs; nothing is redundant.

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

Completeness5/5

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

Output schema exists so return-shape explanation is optional, yet the description still names the key fields and total. Combined with the width/drop caveat and the get_price hand-off, an agent has everything needed to call this correctly.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3; the description adds value by clarifying the filter/repeat semantics of width and drop and warning that the pair is not jointly validated. It does not restate enum values or format details, but those are fully covered in the schema.

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

Purpose4/5

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

States a specific resource (catalog) and its filtering capability by category, partial colour, and width/drop in mm. 'Preferred structured discovery' signals how it differs from the fuzzy search siblings, though it never names search_catalog or search_products.

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

Usage Guidelines3/5

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

'Preferred structured discovery' gives a preference cue that implies this is the go-to when filters are known, but it does not state when NOT to use it or name the alternative tools by name. 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.

request_price_matchA
Read-only
Inspect

Submit a price match claim when the customer has found the same blind at a lower price elsewhere. Custom Blinds matches verified South African retailer prices for identical product, dimensions, and specs. Returns a pre-filled WhatsApp link to the claims team. Not applicable to: Blinds Direct (same supplier), clearance or flash-sale prices, or out-of-stock items. Requires product_id and competitor_price_zar at minimum.

NameRequiredDescriptionDefault
width_mmNoWindow width in mm
height_mmNoWindow height/drop in mm
product_idYesProduct the customer wants to match (e.g. roller-blockout)
customer_nameNoCustomer name
competitor_urlNoURL to competitor product page or quote
competitor_nameNoName of the competitor (e.g. 'Blind Empire')
customer_whatsappNoCustomer WhatsApp number for follow-up
competitor_price_zarYesCompetitor's price in ZAR (incl. VAT)

Output Schema

NameRequiredDescription
noteYes
messageYes
successYes
exclusionsYes
whatsapp_urlYes
claim_summaryYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, and the description adds meaningful context beyond that: it discloses the actual output shape (a pre-filled WhatsApp link rather than a database write), the eligibility filter the claim is validated against, and the matching criteria. It does not cover turnaround, what happens if the claim is rejected, or any rate/auth constraints, so it is strong but not exhaustive.

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

Conciseness4/5

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

Three well-ordered sentences: purpose first, then exclusions, then requirements, with zero filler. Slightly dense in the exclusion clause, but every sentence carries distinct information.

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

Completeness5/5

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

An output schema exists, yet the description still tells the agent the salient return value (WhatsApp link), plus eligibility rules and required inputs. For an 8-parameter, non-destructive submission tool, an agent has everything needed to decide and call correctly.

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

Parameters4/5

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

Schema coverage is 100%, so a baseline of 3 applies, but the description adds real value by naming the two minimum required fields and by explaining that product, dimensions, and specs must be identical for a claim to be verified — which is exactly why width_mm/height_mm exist. It stops short of describing competitor_url or customer_whatsapp usage.

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

Purpose5/5

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

States a specific verb and resource ('Submit a price match claim') plus the triggering condition ('customer has found the same blind at a lower price elsewhere'). The scope is narrowed further by naming what qualifies (verified South African retailer prices, identical product/dimensions/specs), which leaves no ambiguity against sibling tools like get_price or submit_enquiry.

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

Usage Guidelines5/5

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

Gives an explicit positive condition (customer found a lower price at another retailer), explicit exclusions ('Not applicable to: Blinds Direct, clearance or flash-sale prices, or out-of-stock items'), and the minimum prerequisites. This is textbook when/when-not guidance with no inference required.

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

request_swatchAInspect

Log up to 5 colour codes against an EXISTING order for the team (order_ref required; without it the tool returns status order_required and logs nothing). Custom Blinds does not post individual swatches or off-cuts. For orders over R8,000 the customer can ask for the full sample book via WhatsApp; if nothing suits, full refund with no fees. Never quote a sample-book price or courier cost.

NameRequiredDescriptionDefault
suburbNoOptional delivery suburb
order_refYesThe order reference the swatches ship with. Required.
swatch_codesNoOptional specific colour codes (max 5)
customer_nameYesCustomer's full name.
customer_emailYesCustomer's email address.
customer_phoneYesUsed as WhatsApp number
product_interestYese.g. 'Roller Blockout' or 'Honeycomb'

Output Schema

NameRequiredDescription
policyNo
statusYes
messageYes
next_stepNo
order_refNo
request_idNo
swatch_countNo
estimated_delivery_daysNo

TDQS

A4.3/5.0
Behavior4/5

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

Adds meaningful behavior beyond the annotations: without order_ref it returns status order_required and logs nothing. It also discloses business constraints around sample books, refunds, and not quoting prices or courier costs.

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

Conciseness4/5

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

Front-loads the core action and the order_ref requirement. Later sentences carry important guardrails, though the sample-book/refund policy sentence is slightly long.

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

Completeness4/5

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

Given the output schema and annotations, the description supplies the key operational context: existing-order requirement, failure behavior, and what not to promise. It is largely complete for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds semantic value by emphasizing order_ref as required and explaining the concrete failure outcome when it is missing.

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

Purpose5/5

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

States a specific action ('Log up to 5 colour codes') tied to a specific resource ('against an EXISTING order'), and the scope makes it distinguishable from swatch-stock and WhatsApp-handoff siblings.

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

Usage Guidelines4/5

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

Clearly says this is for existing orders, requires order_ref, and rules out individual swatches/off-cuts. It also gives an alternative path for orders over R8,000 via WhatsApp, though it does not directly name sibling tools.

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

search_catalogA
Read-only
Inspect

Preferred free-text discovery. Returns results containing product_id, name, category, description, product_url and colour_count_in_stock, plus total and currency. For structured filters use lookup_catalog. Pass product_id to get_product or get_price.

NameRequiredDescriptionDefault
queryNoFree-text query, e.g. 'blockout' or 'venetian'

Output Schema

NameRequiredDescription
totalYes
resultsYes
currencyYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description adds return-field context plus follow-up routing. However, it does not disclose ranking, pagination, result limits, or optional-empty-query behavior, which would be useful for a search tool.

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

Conciseness4/5

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

The description is front-loaded and compact, with purpose first and alternatives/follow-ups after. The enumerated return fields are somewhat redundant given the output schema, but the overall text remains efficient.

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

Completeness4/5

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

For a simple read-only search tool with a fully documented parameter and an output schema, the description covers purpose, alternative routing, and follow-up usage. It is nearly complete, though it could better distinguish itself from search_products.

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

Parameters3/5

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

Schema description coverage is 100%, so the single query parameter is already documented with examples. The description reinforces that this is free-text discovery but adds no syntax, formatting, or behavior beyond what the schema provides.

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

Purpose4/5

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

The description clearly identifies a free-text discovery/search capability and lists what results contain. It explicitly distinguishes itself from lookup_catalog, but does not mention the sibling search_products, so sibling differentiation is incomplete.

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

Usage Guidelines4/5

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

It gives clear usage guidance: use this for free-text discovery, use lookup_catalog for structured filters, and pass product_id to get_product or get_price. The main gap is that it does not clarify when to use search_products instead.

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

search_productsA
Read-only
Inspect

Legacy discovery, retained for backward compatibility. Prefer search_catalog / lookup_catalog, then get_product. Filters by blind type, colour or maximum dimensions. Returns products with id (not product_id), name, description, features and in-stock colour count. Pass that id as product_id to get_price or configure_product.

NameRequiredDescriptionDefault
typeNoBlind category to filter by: roller, venetian, honeycomb, vertical, outdoor
colourNoColour name to search for (partial match)
provinceNoOptional. Customer's South African province or city. Garden Route locations get Duncan's direct contact; other locations get the online shop contact.
max_width_mmNoMaximum width in millimetres the product supports
max_height_mmNoMaximum height/drop in millimetres the product supports

Output Schema

NameRequiredDescription
totalYes
contactNo
currencyNo
productsYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so safety is covered; the description adds real value by disclosing the return shape ('id (not product_id), name, description, features and in-stock colour count') and the crucial id-mapping behaviour for get_price/configure_product. It does not mention pagination, result limits, or what an empty result means, so with an output schema present and annotations covering safety, this lands at solid 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.

Conciseness4/5

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

Three tight sentences with the legacy caveat and preferred alternatives front-loaded, then filters, then return shape and handoff. Dense but every clause carries information; only minor cost is that the return-shape sentence packs several facts.

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

Completeness5/5

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

For a read-only search tool with full schema coverage and an output schema, the description covers the remaining gaps an agent would otherwise hit: deprecation status, the correct next tool, and the id-vs-product_id naming trap. 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.

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all five parameters including the province-specific contact behaviour. The description only summarises the filter set (blind type, colour, max dimensions) without adding format or syntax detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (search products) plus the filtering dimensions available, and immediately distinguishes itself from siblings search_catalog, lookup_catalog and get_product by naming them as preferred. An agent knows exactly what this tool is and that it is a legacy path.

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

Usage Guidelines5/5

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

Explicit routing: 'Legacy discovery, retained for backward compatibility. Prefer search_catalog / lookup_catalog, then get_product.' It gives both the exclusion (don't prefer this) and the ordered alternative chain, which is exactly the when/when-not guidance an agent needs.

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

submit_enquiryAInspect

Legacy auth-required tool, prefer the open UCP flow (create_cart → create_checkout → complete_checkout) for credentialless checkout. Use submit_enquiry only when the customer wants a sales team follow-up by email rather than paying online. Requires Bearer token. Pass a configure_product output plus customer name, email, and phone. Team responds within 24 hours.

NameRequiredDescriptionDefault
messageYesRequired enquiry message; at least 10 characters after trimming
customer_nameYesCustomer full name
customer_emailYesCustomer email address
customer_phoneYesCustomer phone number
product_configYesProduct configuration from configure_product

Output Schema

NameRequiredDescription
contactYes
messageYes
successYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare readOnly=false and destructive=false; the description adds real behavioral context on top: legacy status, a Bearer token requirement, the 24-hour team response expectation, and the prerequisite that product_config comes from configure_product. It stops short of describing what happens on validation failure or whether duplicate enquiries are deduplicated.

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

Conciseness5/5

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

Four sentences, each doing distinct work: deprecation/routing, the use case, auth, and input provenance plus turnaround. The most important routing information is front-loaded.

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

Completeness5/5

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

For a five-parameter mutation with a nested object, the description covers the prerequisite tool, auth, SLA, and the alternative path; return values are covered by the existing output schema. An agent has everything needed to decide and to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema carries the field-level detail and the baseline would be 3. The description earns a bump by disclosing provenance — that product_config must be a configure_product output — which the schema does not state.

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

Purpose4/5

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

The description makes clear this submits a sales enquiry by email rather than a purchase, and it explicitly positions itself against the create_cart → create_checkout → complete_checkout flow. The verb+resource are implied by the name and reinforced by 'sales team follow-up by email', though the first sentence is routing advice rather than a direct statement of what the call does.

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

Usage Guidelines5/5

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

It states when to use (customer wants email follow-up instead of paying online) and when not to use (default to the credentialless UCP flow, named step by step). This is the strongest dimension of the definition — no inference required.

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

update_cartA
Destructive
Inspect

Modify an open cart before checkout. op: 'add' appends items, 'remove' drops items by 0-based index, 'set' replaces the full item list, 'clear' empties the cart. Merges customer details (name, email, phone) via the customer field. Call get_cart afterwards to confirm. Cannot modify a cart that already has a checkout in progress.

NameRequiredDescriptionDefault
opNoadd appends items, remove drops the items at the given indices, set replaces the whole item list, clear empties the cart. Default set.set
itemsNoItems for add or set. Each needs product_id, width_mm, height_mm, colour and mount_type.
cart_idYescart_id returned by create_cart.
indicesNoItem indices to remove (0-based) when op='remove'
customerNoCustomer details (name, email, phone, address, city) merged into the cart.

Output Schema

NameRequiredDescription
itemsYes
cart_idYes
currencyYes
customerYes
total_zarYes
created_atYes
expires_atYes
item_countYes
updated_atYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already flag readOnlyHint=false and destructiveHint=true, and the description corroborates this with 'remove drops items' and 'clear empties the cart'. Beyond the annotations it adds a genuine precondition (no edits while checkout is in progress) and merge semantics for customer data, though it does not address reversibility or error behavior.

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

Conciseness5/5

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

Front-loads purpose, then op modes, then the follow-up step, then the precondition. Five short sentences, each carrying distinct information with no filler.

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

Completeness5/5

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

For a destructive mutation tool with five parameters, nested item objects, full schema coverage and an output schema, the description covers what an agent needs: valid ops, the required follow-up read, and the blocking precondition. Return values and price recalculation are already documented elsewhere.

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

Parameters4/5

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; the description earns an extra point by clarifying that customer details are merged rather than replaced, and by restating the op semantics and 0-based indexing of indices in a compact way. It still duplicates the enum description verbatim rather than adding new detail.

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

Purpose5/5

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

States a specific verb and resource (modify an open cart) and immediately enumerates the four mutation modes with their semantics. It is clearly distinguishable from get_cart (which is named as the confirmation step) and from checkout-level siblings by the 'before checkout' scoping.

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

Usage Guidelines4/5

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

Gives concrete operating guidance: call get_cart afterwards to confirm, and a hard precondition that carts with a checkout in progress cannot be modified. It does not explicitly contrast itself with update_checkout or state when to prefer 'set' over 'add'/'remove', but the usage context is otherwise clear.

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

update_checkoutA
Destructive
Inspect

Update customer details or payment_method only before payment-link generation. Paid, cancelled and payment-in-progress checkouts are rejected. Concurrent state changes are detected; retrieve the latest status before retrying.

NameRequiredDescriptionDefault
customerNoCorrected customer details (name, email, phone, address, city).
checkout_idYescheckout_id returned by create_checkout.
payment_methodNoyoco for card or ozow for instant EFT.

Output Schema

NameRequiredDescription
ap2No
itemsNo
statusYes
messageNo
currencyYes
customerNo
next_stepNo
total_zarYes
item_countNo
checkout_idYes
payment_urlNo
payment_methodNo
provider_referenceNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, so the description's job is added context, which it supplies: which lifecycle states cause rejection and that concurrent state changes are detected, forcing a read-then-retry pattern. It does not describe what a successful update returns or whether prior customer data is overwritten, leaving a small gap.

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

Conciseness5/5

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

Three short sentences, each load-bearing: scope/mutable fields first, rejection conditions second, concurrency/retry last. No restatement of the name and no filler.

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

Completeness4/5

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 no explanation, and the description covers the mutation precondition, rejection states, and concurrency failure mode. The only missing piece is failure semantics for validation errors (e.g. bad phone/email) beyond the schema's hints.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents checkout_id provenance, the yoco/ozow enum meaning, and per-field validation notes. The description adds no field-level meaning beyond what the schema provides, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb ('Update') and the two mutable resources ('customer details or payment_method'), which tells an agent exactly what can change. The implicit contrast with update_cart is carried by the resource name rather than an explicit sentence, so it stops short of full sibling differentiation.

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

Usage Guidelines4/5

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

Gives an explicit timing precondition ('only before payment-link generation') and enumerates the states that will be rejected (paid, cancelled, payment-in-progress). It also tells the agent to re-read status before retrying, though it does not name the sibling tool (get_checkout) to use for that read.

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.

  1. 16 tool updates
    • Changedcancel_cart1 field changed
      • addedInput schema / properties / cart_id / description
        Added value: +"cart_id returned by create_cart."
    • Changedcancel_checkout1 field changed
      • addedInput schema / properties / checkout_id / description
        Added value: +"checkout_id returned by create_checkout."
    • Changedcheck_colour_stock2 fields changed
      • addedInput schema / properties / colour_name / description
        Added value: +"Colour name to check, e.g. \"White\"."
      • addedInput schema / properties / product_id / description
        Added value: +"product_id from search_catalog or lookup_catalog."
    • Changedcomplete_checkout1 field changed
      • addedInput schema / properties / checkout_id / description
        Added value: +"checkout_id returned by create_checkout."
    • Changedcreate_cart1 field changed
      • addedInput schema / properties / customer / description
        Added value: +"Optional customer details (name, email, phone, address, city)."
    • Changedcreate_checkout2 fields changed
      • addedInput schema / properties / customer / description
        Added value: +"Customer details. Name, email, mobile phone and delivery address are required; city is optional. Placeholder or test details are refused."
      • addedInput schema / properties / items / description
        Added value: +"Line items to buy. Required if cart_id is not given."
    • Changedget_cart1 field changed
      • addedInput schema / properties / cart_id / description
        Added value: +"cart_id returned by create_cart."
    • Changedget_checkout1 field changed
      • addedInput schema / properties / checkout_id / description
        Added value: +"checkout_id returned by create_checkout."
    • Changedget_order2 fields changed
      • addedInput schema / properties / customer_email / description
        Added value: +"Email address on the order. Must match the order record (not case-sensitive)."
      • addedInput schema / properties / order_id / description
        Added value: +"Order reference: the checkout_id returned by create_checkout."
    • Changedget_product1 field changed
      • addedInput schema / properties / product_id / description
        Added value: +"product_id from search_catalog or lookup_catalog."
    • Changedget_product_recommendation5 fields changed
      • addedInput schema / properties / aesthetic / description
        Added value: +"Optional style preference. Noted in the reply."
      • addedInput schema / properties / location / description
        Added value: +"Optional customer city or suburb. Accepted but not currently used."
      • addedInput schema / properties / max_budget_zar / description
        Added value: +"Optional budget in ZAR. Drops options whose 1000x1000mm starting price is above it."
      • addedInput schema / properties / primary_concern / description
        Added value: +"Main need: blockout, heat, glare, moisture, privacy, security or automation. security returns a Garden Route handoff, not shop products."
      • addedInput schema / properties / room / description
        Added value: +"Optional room, e.g. \"bedroom\". Noted in the reply."
    • Changedget_whatsapp_handoff1 field changed
      • addedInput schema / properties / customer_name / description
        Added value: +"Customer's name, used in the prefilled WhatsApp message."
    • Changedlookup_catalog3 fields changed
      • addedInput schema / properties / colour / description
        Added value: +"Partial colour name to match, e.g. \"white\"."
      • addedInput schema / properties / max_height_mm / description
        Added value: +"Only products that can be made at least this high (drop), in millimetres. Checked separately from max_width_mm; confirm the exact pair with get_price."
      • addedInput schema / properties / max_width_mm / description
        Added value: +"Only products that can be made at least this wide, in millimetres. Checked separately from max_height_mm, not as a pair."
    • Changedrequest_swatch2 fields changed
      • addedInput schema / properties / customer_email / description
        Added value: +"Customer's email address."
      • addedInput schema / properties / customer_name / description
        Added value: +"Customer's full name."
    • Changedupdate_cart4 fields changed
      • addedInput schema / properties / cart_id / description
        Added value: +"cart_id returned by create_cart."
      • addedInput schema / properties / customer / description
        Added value: +"Customer details (name, email, phone, address, city) merged into the cart."
      • addedInput schema / properties / items / description
        Added value: +"Items for add or set. Each needs product_id, width_mm, height_mm, colour and mount_type."
      • addedInput schema / properties / op / description
        Added value: +"add appends items, remove drops the items at the given indices, set replaces the whole item list, clear empties the cart. Default set."
    • Changedupdate_checkout3 fields changed
      • addedInput schema / properties / checkout_id / description
        Added value: +"checkout_id returned by create_checkout."
      • addedInput schema / properties / customer / description
        Added value: +"Corrected customer details (name, email, phone, address, city)."
      • addedInput schema / properties / payment_method / description
        Added value: +"yoco for card or ozow for instant EFT."
  2. 3 tool updates
    • Changedget_ar_visualizer_url6 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"Which tool to surface. Default: both."New value: +"Which link goes in url: visualize (own-window visualiser), measure (measuring guide) or both (visualiser, the default). Both links are always returned."
      • changedInput schema / properties / product_id / description
        Previous value: -"Optional. Pre-select a product in the visualizer (e.g. roller-blockout, venetian-25mm-aluwood)."New value: +"Optional. Pre-select a product in the visualiser (e.g. roller-blockout, double-roller-zebra, outdoor-blinds)."
      • addedOutput schema / properties / measure_url
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / supported_products
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "label": {
        +        "type": "string"
        +      },
        +      "product_id": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "product_id",
        +      "label"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / visualiser_url
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "url",
        -  "note"
        -]New value: +[
        +  "url",
        +  "visualiser_url",
        +  "measure_url",
        +  "note"
        +]
    • Changedget_delivery_estimate8 fields changed
      • removedOutput schema / properties / estimated_dispatch_date
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / production_starts
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / production_working_days
        Removed value: -{
        -  "type": "number"
        -}
      • addedOutput schema / properties / production_working_days_max
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / production_working_days_min
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / transit_working_days_max
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / transit_working_days_min
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "order_date",
        -  "production_working_days",
        -  "estimated_dispatch_date",
        -  "delivery_after_dispatch",
        -  "expedited_available",
        -  "summary",
        -  "important"
        -]New value: +[
        +  "production_working_days_min",
        +  "production_working_days_max",
        +  "transit_working_days_min",
        +  "transit_working_days_max",
        +  "delivery_after_dispatch",
        +  "summary",
        +  "important"
        +]
    • Changedget_product1 field changed
      • changedOutput schema / properties / size_limits / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "availability_rule": {
        -        "type": "string"
        -      },
        -      "combination_dependent": {
        -        "type": "boolean"
        -      },
        -      "max_height_mm": {
        -        "type": "number"
        -      },
        -      "max_width_mm": {
        -        "type": "number"
        -      },
        -      "measurement_note": {
        -        "type": "string"
        -      },
        -      "minimum_charge_height_mm": {
        -        "type": "number"
        -      },
        -      "minimum_charge_width_mm": {
        -        "type": "number"
        -      },
        -      "product_id": {
        -        "type": "string"
        -      },
        -      "unit": {
        -        "const": "mm",
        -        "type": "string"
        -      },
        -      "validation_note": {
        -        "type": "string"
        -      },
        -      "width_drop_frontier": {
        -        "items": {
        -          "additionalProperties": true,
        -          "properties": {
        -            "max_drop_mm": {
        -              "type": "number"
        -            },
        -            "width_band_max_mm": {
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "width_band_max_mm",
        -            "max_drop_mm"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "product_id",
        -      "unit",
        -      "max_width_mm",
        -      "max_height_mm",
        -      "minimum_charge_width_mm",
        -      "minimum_charge_height_mm",
        -      "combination_dependent",
        -      "availability_rule",
        -      "width_drop_frontier",
        -      "measurement_note",
        -      "validation_note"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "availability_rule": {
        +        "type": "string"
        +      },
        +      "combination_dependent": {
        +        "type": "boolean"
        +      },
        +      "max_height_mm": {
        +        "type": "number"
        +      },
        +      "max_width_mm": {
        +        "type": "number"
        +      },
        +      "measurement_note": {
        +        "type": "string"
        +      },
        +      "minimum_charge_height_mm": {
        +        "type": "number"
        +      },
        +      "minimum_charge_width_mm": {
        +        "type": "number"
        +      },
        +      "minimum_order_height_mm": {
        +        "type": "number"
        +      },
        +      "minimum_order_width_mm": {
        +        "type": "number"
        +      },
        +      "product_id": {
        +        "type": "string"
        +      },
        +      "unit": {
        +        "const": "mm",
        +        "type": "string"
        +      },
        +      "validation_note": {
        +        "type": "string"
        +      },
        +      "width_drop_frontier": {
        +        "items": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "max_drop_mm": {
        +              "type": "number"
        +            },
        +            "width_band_max_mm": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "width_band_max_mm",
        +            "max_drop_mm"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "product_id",
        +      "unit",
        +      "max_width_mm",
        +      "max_height_mm",
        +      "minimum_charge_width_mm",
        +      "minimum_charge_height_mm",
        +      "combination_dependent",
        +      "availability_rule",
        +      "width_drop_frontier",
        +      "measurement_note",
        +      "validation_note"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  3. 15 tool updates
    • Changedcheck_colour_stock12 fields changed
      • removedOutput schema / properties / alternative_colours
        Removed value: -{
        -  "items": {
        -    "additionalProperties": true,
        -    "properties": {
        -      "colour_name": {
        -        "type": "string"
        -      },
        -      "in_stock": {
        -        "type": "boolean"
        -      },
        -      "swatch_url": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "colour_name",
        -      "in_stock"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • addedOutput schema / properties / colour
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / colour_name
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / matching_colours / items / properties / colour_name
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / matching_colours / items / properties / expected_restock
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / matching_colours / items / properties / finish
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / matching_colours / items / properties / hex
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / matching_colours / items / properties / material
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / matching_colours / items / properties / name
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / matching_colours / items / properties / swatch_url
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / properties / matching_colours / items / required
        Previous value: -[
        -  "colour_name",
        -  "in_stock"
        -]New value: +[
        +  "name",
        +  "in_stock"
        +]
      • removedOutput schema / properties / swatch_url
        Removed value: -{
        -  "type": "string"
        -}
    • Changedcomplete_checkout3 fields changed
      • removedOutput schema / properties / created_at
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • changedOutput schema / properties / items / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "colour": {
        -          "type": "string"
        -        },
        -        "finish": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ]
        -        },
        -        "height": {
        -          "type": "number"
        -        },
        -        "mountType": {
        -          "type": "string"
        -        },
        -        "price": {
        -          "type": "number"
        -        },
        -        "productId": {
        -          "type": "string"
        -        },
        -        "productName": {
        -          "type": "string"
        -        },
        -        "quantity": {
        -          "type": "number"
        -        },
        -        "total": {
        -          "type": "number"
        -        },
        -        "width": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "colour": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "drop_mm": {
        +          "type": "number"
        +        },
        +        "mount_type": {
        +          "type": "string"
        +        },
        +        "product_name": {
        +          "type": "string"
        +        },
        +        "product_slug": {
        +          "type": "string"
        +        },
        +        "quantity": {
        +          "type": "number"
        +        },
        +        "total_price": {
        +          "type": "number"
        +        },
        +        "unit_price": {
        +          "type": "number"
        +        },
        +        "width_mm": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / payment_status
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
    • Changedconfigure_product32 fields changed
      • removedOutput schema / oneOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "success": {
        -        "const": true
        -      }
        -    },
        -    "required": [
        -      "configuration"
        -    ]
        -  },
        -  {
        -    "properties": {
        -      "success": {
        -        "const": false
        -      }
        -    },
        -    "required": [
        -      "message"
        -    ]
        -  }
        -]
      • addedOutput schema / properties / colour
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / configuration
        Removed value: -{
        -  "additionalProperties": true,
        -  "properties": {
        -    "category": {
        -      "type": "string"
        -    },
        -    "colour": {
        -      "type": "string"
        -    },
        -    "colour_hex": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "contact_name": {
        -      "type": "string"
        -    },
        -    "contact_phone": {
        -      "type": "string"
        -    },
        -    "contact_required": {
        -      "type": "boolean"
        -    },
        -    "currency": {
        -      "const": "ZAR",
        -      "type": "string"
        -    },
        -    "effective_height_mm": {
        -      "type": "number"
        -    },
        -    "effective_width_mm": {
        -      "type": "number"
        -    },
        -    "finish": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "height_mm": {
        -      "type": "number"
        -    },
        -    "lead_time": {
        -      "type": "string"
        -    },
        -    "material": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "measurement_review_required": {
        -      "type": "boolean"
        -    },
        -    "message": {
        -      "type": "string"
        -    },
        -    "mount_type": {
        -      "type": "string"
        -    },
        -    "note": {
        -      "type": "string"
        -    },
        -    "product_id": {
        -      "type": "string"
        -    },
        -    "product_name": {
        -      "type": "string"
        -    },
        -    "product_url": {
        -      "type": "string"
        -    },
        -    "quantity": {
        -      "type": "number"
        -    },
        -    "success": {
        -      "type": "boolean"
        -    },
        -    "total_price_zar": {
        -      "type": "number"
        -    },
        -    "unit_price_zar": {
        -      "type": "number"
        -    },
        -    "vat_included": {
        -      "type": "boolean"
        -    },
        -    "whatsapp": {
        -      "type": "string"
        -    },
        -    "width_mm": {
        -      "type": "number"
        -    }
        -  },
        -  "required": [
        -    "product_id",
        -    "width_mm",
        -    "height_mm",
        -    "colour",
        -    "mount_type",
        -    "quantity",
        -    "unit_price_zar",
        -    "total_price_zar",
        -    "currency",
        -    "vat_included"
        -  ],
        -  "type": "object"
        -}
      • addedOutput schema / properties / contact
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "email": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "whatsapp": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [],
        +  "type": "object"
        +}
      • removedOutput schema / properties / contact_name
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / contact_phone
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / contact_required
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / currency
        Added value: +{
        +  "const": "ZAR",
        +  "type": "string"
        +}
      • addedOutput schema / properties / delivery
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / effective_height_mm
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / effective_width_mm
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / finish
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / height_mm
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / in_stock
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / lead_time
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / limits
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "required": [],
        +  "type": "object"
        +}
      • removedOutput schema / properties / message
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / minimum_charge_applied
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / mount_type
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / note
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / price_zar
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / product_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / product_name
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / quantity
        Added value: +{
        +  "type": "number"
        +}
      • removedOutput schema / properties / success
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / total_price_zar
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / unit_price_zar
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / vat_included
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / width_mm
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "success"
        -]New value: +[
        +  "product_id",
        +  "width_mm",
        +  "height_mm",
        +  "colour",
        +  "mount_type",
        +  "quantity",
        +  "unit_price_zar",
        +  "total_price_zar",
        +  "currency"
        +]
    • Changedcreate_checkout3 fields changed
      • removedOutput schema / properties / created_at
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • changedOutput schema / properties / items / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "colour": {
        -          "type": "string"
        -        },
        -        "finish": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ]
        -        },
        -        "height": {
        -          "type": "number"
        -        },
        -        "mountType": {
        -          "type": "string"
        -        },
        -        "price": {
        -          "type": "number"
        -        },
        -        "productId": {
        -          "type": "string"
        -        },
        -        "productName": {
        -          "type": "string"
        -        },
        -        "quantity": {
        -          "type": "number"
        -        },
        -        "total": {
        -          "type": "number"
        -        },
        -        "width": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "colour": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "drop_mm": {
        +          "type": "number"
        +        },
        +        "mount_type": {
        +          "type": "string"
        +        },
        +        "product_name": {
        +          "type": "string"
        +        },
        +        "product_slug": {
        +          "type": "string"
        +        },
        +        "quantity": {
        +          "type": "number"
        +        },
        +        "total_price": {
        +          "type": "number"
        +        },
        +        "unit_price": {
        +          "type": "number"
        +        },
        +        "width_mm": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / payment_status
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
    • Changedcreate_order13 fields changed
      • addedOutput schema / properties / ap2
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "merchant_authorization": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "merchant_authorization"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / checkout_id
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / contact
        Removed value: -{
        -  "additionalProperties": true,
        -  "properties": {
        -    "contact_name": {
        -      "type": "string"
        -    },
        -    "contact_phone": {
        -      "type": "string"
        -    },
        -    "email": {
        -      "type": "string"
        -    },
        -    "note": {
        -      "type": "string"
        -    },
        -    "whatsapp": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [],
        -  "type": "object"
        -}
      • addedOutput schema / properties / customer
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "address": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "city": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "email": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "phone": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [],
        +  "type": "object"
        +}
      • addedOutput schema / properties / items
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "colour": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "drop_mm": {
        +            "type": "number"
        +          },
        +          "mount_type": {
        +            "type": "string"
        +          },
        +          "product_name": {
        +            "type": "string"
        +          },
        +          "product_slug": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "total_price": {
        +            "type": "number"
        +          },
        +          "unit_price": {
        +            "type": "number"
        +          },
        +          "width_mm": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / order_id
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / order_reference
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / payment_method
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / provider_reference
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • removedOutput schema / properties / success
        Removed value: -{
        -  "type": "boolean"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "success",
        -  "order_id",
        -  "total_zar",
        -  "currency",
        -  "item_count",
        -  "payment_url",
        -  "message",
        -  "contact"
        -]New value: +[
        +  "order_reference",
        +  "checkout_id",
        +  "status",
        +  "payment_url",
        +  "message"
        +]
    • Changedget_ar_visualizer_url7 fields changed
      • removedOutput schema / properties / ar_measurement_note
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / ar_measurement_url
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / product_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • removedOutput schema / properties / product_visualizer_note
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / product_visualizer_url
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / url
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "note"
        -]New value: +[
        +  "url",
        +  "note"
        +]
    • Changedget_checkout3 fields changed
      • removedOutput schema / properties / created_at
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • changedOutput schema / properties / items / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "colour": {
        -          "type": "string"
        -        },
        -        "finish": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ]
        -        },
        -        "height": {
        -          "type": "number"
        -        },
        -        "mountType": {
        -          "type": "string"
        -        },
        -        "price": {
        -          "type": "number"
        -        },
        -        "productId": {
        -          "type": "string"
        -        },
        -        "productName": {
        -          "type": "string"
        -        },
        -        "quantity": {
        -          "type": "number"
        -        },
        -        "total": {
        -          "type": "number"
        -        },
        -        "width": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "colour": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "drop_mm": {
        +          "type": "number"
        +        },
        +        "mount_type": {
        +          "type": "string"
        +        },
        +        "product_name": {
        +          "type": "string"
        +        },
        +        "product_slug": {
        +          "type": "string"
        +        },
        +        "quantity": {
        +          "type": "number"
        +        },
        +        "total_price": {
        +          "type": "number"
        +        },
        +        "unit_price": {
        +          "type": "number"
        +        },
        +        "width_mm": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / payment_status
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
    • Changedget_order10 fields changed
      • removedOutput schema / properties / created_at
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • removedOutput schema / properties / customer
        Removed value: -{
        -  "additionalProperties": true,
        -  "properties": {
        -    "address": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "city": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "email": {
        -      "type": "string"
        -    },
        -    "name": {
        -      "type": "string"
        -    },
        -    "phone": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    }
        -  },
        -  "required": [],
        -  "type": "object"
        -}
      • changedOutput schema / properties / items / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "colour": {
        -          "type": "string"
        -        },
        -        "finish": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ]
        -        },
        -        "height": {
        -          "type": "number"
        -        },
        -        "mountType": {
        -          "type": "string"
        -        },
        -        "price": {
        -          "type": "number"
        -        },
        -        "productId": {
        -          "type": "string"
        -        },
        -        "productName": {
        -          "type": "string"
        -        },
        -        "quantity": {
        -          "type": "number"
        -        },
        -        "total": {
        -          "type": "number"
        -        },
        -        "width": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "colour": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "drop_mm": {
        +          "type": "number"
        +        },
        +        "mount_type": {
        +          "type": "string"
        +        },
        +        "product_name": {
        +          "type": "string"
        +        },
        +        "product_slug": {
        +          "type": "string"
        +        },
        +        "quantity": {
        +          "type": "number"
        +        },
        +        "total_price": {
        +          "type": "number"
        +        },
        +        "unit_price": {
        +          "type": "number"
        +        },
        +        "width_mm": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / lead_time
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / order_reference
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / order_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / paid_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • removedOutput schema / properties / payment_method
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • removedOutput schema / properties / status
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "order_id"
        -]New value: +[
        +  "order_id",
        +  "payment_status",
        +  "total_zar",
        +  "currency"
        +]
    • Changedget_payment_methods10 fields changed
      • removedOutput schema / properties / handlers / items / properties / display_name
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / handlers / items / properties / methods
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • addedOutput schema / properties / handlers / items / properties / name
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / handlers / items / properties / note
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / handlers / items / properties / redirect
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / handlers / items / properties / supports
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / handlers / items / properties / supports_3ds
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / handlers / items / properties / supports_banks
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / handlers / items / properties / webhook_verified
        Removed value: -{
        -  "type": "boolean"
        -}
      • changedOutput schema / properties / handlers / items / required
        Previous value: -[
        -  "id",
        -  "display_name",
        -  "methods",
        -  "redirect",
        -  "webhook_verified"
        -]New value: +[
        +  "id",
        +  "name",
        +  "supports"
        +]
    • Changedget_price16 fields changed
      • removedOutput schema / oneOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "success": {
        -        "const": true
        -      }
        -    },
        -    "required": [
        -      "product_id",
        -      "width_mm",
        -      "height_mm",
        -      "quantity",
        -      "unit_price_zar",
        -      "total_price_zar",
        -      "currency",
        -      "vat_included"
        -    ]
        -  },
        -  {
        -    "properties": {
        -      "success": {
        -        "const": false
        -      }
        -    },
        -    "required": [
        -      "message"
        -    ]
        -  }
        -]
      • addedOutput schema / properties / contact
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "email": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "whatsapp": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [],
        +  "type": "object"
        +}
      • removedOutput schema / properties / contact_name
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / contact_phone
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / contact_required
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / delivery
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / limits
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "required": [],
        +  "type": "object"
        +}
      • removedOutput schema / properties / measurement_review_required
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / message
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / minimum_charge_applied
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / note
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / product_name
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / success
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / whatsapp
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "success"
        -]New value: +[
        +  "product_id",
        +  "width_mm",
        +  "height_mm",
        +  "quantity",
        +  "unit_price_zar",
        +  "total_price_zar",
        +  "currency",
        +  "vat_included"
        +]
    • Changedget_product18 fields changed
      • addedOutput schema / properties / category
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / colour_count_in_stock
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / colours
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "expected_restock": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "finish": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "hex": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "in_stock": {
        +        "type": "boolean"
        +      },
        +      "material": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "in_stock"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / description
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / features
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / installation_type
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / materials
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / max_height_mm
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / max_width_mm
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / name
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / product
        Removed value: -{
        -  "additionalProperties": true,
        -  "properties": {
        -    "category": {
        -      "type": "string"
        -    },
        -    "colour_count_in_stock": {
        -      "type": "number"
        -    },
        -    "colours": {
        -      "items": {
        -        "additionalProperties": true,
        -        "properties": {
        -          "expected_restock": {
        -            "anyOf": [
        -              {
        -                "type": "string"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ]
        -          },
        -          "finish": {
        -            "anyOf": [
        -              {
        -                "type": "string"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ]
        -          },
        -          "hex": {
        -            "anyOf": [
        -              {
        -                "type": "string"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ]
        -          },
        -          "in_stock": {
        -            "type": "boolean"
        -          },
        -          "material": {
        -            "anyOf": [
        -              {
        -                "type": "string"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ]
        -          },
        -          "name": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "description": {
        -      "type": "string"
        -    },
        -    "features": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "installation_type": {
        -      "type": "string"
        -    },
        -    "materials": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "max_height_mm": {
        -      "type": "number"
        -    },
        -    "max_width_mm": {
        -      "type": "number"
        -    },
        -    "name": {
        -      "type": "string"
        -    },
        -    "product_id": {
        -      "type": "string"
        -    },
        -    "product_url": {
        -      "type": "string"
        -    },
        -    "schema_url": {
        -      "type": "string"
        -    },
        -    "size_limits": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "availability_rule": {
        -          "type": "string"
        -        },
        -        "combination_dependent": {
        -          "type": "boolean"
        -        },
        -        "max_height_mm": {
        -          "type": "number"
        -        },
        -        "max_width_mm": {
        -          "type": "number"
        -        },
        -        "measurement_note": {
        -          "type": "string"
        -        },
        -        "minimum_charge_height_mm": {
        -          "type": "number"
        -        },
        -        "minimum_charge_width_mm": {
        -          "type": "number"
        -        },
        -        "product_id": {
        -          "type": "string"
        -        },
        -        "unit": {
        -          "const": "mm",
        -          "type": "string"
        -        },
        -        "validation_note": {
        -          "type": "string"
        -        },
        -        "width_drop_frontier": {
        -          "items": {
        -            "additionalProperties": true,
        -            "properties": {
        -              "max_drop_mm": {
        -                "type": "number"
        -              },
        -              "width_band_max_mm": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "width_band_max_mm",
        -              "max_drop_mm"
        -            ],
        -            "type": "object"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "required": [
        -        "product_id",
        -        "unit",
        -        "max_width_mm",
        -        "max_height_mm",
        -        "minimum_charge_width_mm",
        -        "minimum_charge_height_mm",
        -        "combination_dependent",
        -        "availability_rule",
        -        "width_drop_frontier",
        -        "measurement_note",
        -        "validation_note"
        -      ],
        -      "type": "object"
        -    },
        -    "suitable_for": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "product_id",
        -    "name",
        -    "category",
        -    "colours",
        -    "product_url"
        -  ],
        -  "type": "object"
        -}
      • addedOutput schema / properties / product_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / product_url
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / schema_url
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / size_limits
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "availability_rule": {
        +          "type": "string"
        +        },
        +        "combination_dependent": {
        +          "type": "boolean"
        +        },
        +        "max_height_mm": {
        +          "type": "number"
        +        },
        +        "max_width_mm": {
        +          "type": "number"
        +        },
        +        "measurement_note": {
        +          "type": "string"
        +        },
        +        "minimum_charge_height_mm": {
        +          "type": "number"
        +        },
        +        "minimum_charge_width_mm": {
        +          "type": "number"
        +        },
        +        "product_id": {
        +          "type": "string"
        +        },
        +        "unit": {
        +          "const": "mm",
        +          "type": "string"
        +        },
        +        "validation_note": {
        +          "type": "string"
        +        },
        +        "width_drop_frontier": {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "max_drop_mm": {
        +                "type": "number"
        +              },
        +              "width_band_max_mm": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "width_band_max_mm",
        +              "max_drop_mm"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "product_id",
        +        "unit",
        +        "max_width_mm",
        +        "max_height_mm",
        +        "minimum_charge_width_mm",
        +        "minimum_charge_height_mm",
        +        "combination_dependent",
        +        "availability_rule",
        +        "width_drop_frontier",
        +        "measurement_note",
        +        "validation_note"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / starting_price_zar
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / suitable_for
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "product"
        -]New value: +[
        +  "product_id",
        +  "name",
        +  "category",
        +  "colours",
        +  "product_url"
        +]
    • Changedrequest_swatch7 fields changed
      • addedInput schema / properties / order_ref
        Added value: +{
        +  "description": "The order reference the swatches ship with. Required.",
        +  "type": "string"
        +}
      • changedInput schema / properties / swatch_codes / description
        Previous value: -"Optional specific colour codes; no count limit enforced by this handler"New value: +"Optional specific colour codes (max 5)"
      • changedInput schema / required
        Previous value: -[
        -  "customer_name",
        -  "customer_email",
        -  "customer_phone",
        -  "product_interest"
        -]New value: +[
        +  "customer_name",
        +  "customer_email",
        +  "customer_phone",
        +  "product_interest",
        +  "order_ref"
        +]
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / order_ref
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / policy
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "request_id",
        -  "status",
        -  "estimated_delivery_days",
        -  "swatch_count",
        -  "message"
        -]New value: +[
        +  "status",
        +  "message"
        +]
    • Changedsearch_products14 fields changed
      • addedOutput schema / properties / contact
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "email": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "whatsapp": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [],
        +  "type": "object"
        +}
      • removedOutput schema / properties / contact_name
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / contact_phone
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / currency
        Added value: +{
        +  "const": "ZAR",
        +  "type": "string"
        +}
      • removedOutput schema / properties / note
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / products / items / properties / colour_count
        Removed value: -{
        -  "type": "number"
        -}
      • addedOutput schema / properties / products / items / properties / colour_count_in_stock
        Added value: +{
        +  "type": "number"
        +}
      • removedOutput schema / properties / products / items / properties / id
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / products / items / properties / installation_type
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / products / items / properties / materials
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • addedOutput schema / properties / products / items / properties / product_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / products / items / properties / starting_price_zar
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • removedOutput schema / properties / products / items / properties / suitable_for
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • changedOutput schema / properties / products / items / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "category",
        -  "product_url"
        -]New value: +[
        +  "product_id",
        +  "name",
        +  "category",
        +  "product_url"
        +]
    • Changedsubmit_enquiry5 fields changed
      • removedOutput schema / properties / contact / properties / contact_name
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / contact / properties / contact_phone
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / contact / properties / name
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / enquiry_id
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "success",
        -  "enquiry_id",
        -  "message",
        -  "contact"
        -]New value: +[
        +  "success",
        +  "message",
        +  "contact"
        +]
    • Changedupdate_checkout3 fields changed
      • removedOutput schema / properties / created_at
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
      • changedOutput schema / properties / items / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "colour": {
        -          "type": "string"
        -        },
        -        "finish": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ]
        -        },
        -        "height": {
        -          "type": "number"
        -        },
        -        "mountType": {
        -          "type": "string"
        -        },
        -        "price": {
        -          "type": "number"
        -        },
        -        "productId": {
        -          "type": "string"
        -        },
        -        "productName": {
        -          "type": "string"
        -        },
        -        "quantity": {
        -          "type": "number"
        -        },
        -        "total": {
        -          "type": "number"
        -        },
        -        "width": {
        -          "type": "number"
        -        }
        -      },
        -      "required": [],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "colour": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "drop_mm": {
        +          "type": "number"
        +        },
        +        "mount_type": {
        +          "type": "string"
        +        },
        +        "product_name": {
        +          "type": "string"
        +        },
        +        "product_slug": {
        +          "type": "string"
        +        },
        +        "quantity": {
        +          "type": "number"
        +        },
        +        "total_price": {
        +          "type": "number"
        +        },
        +        "unit_price": {
        +          "type": "number"
        +        },
        +        "width_mm": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / payment_status
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ]
        -}
  4. 26 tool updates
    • Changedcancel_cart1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "cancelled": {
        +      "type": "boolean"
        +    },
        +    "cart_id": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "cancelled",
        +    "cart_id"
        +  ],
        +  "type": "object"
        +}
    • Changedcancel_checkout1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "checkout_id": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "checkout_id",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedcheck_colour_stock1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "alternative_colours": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "colour_name": {
        +            "type": "string"
        +          },
        +          "in_stock": {
        +            "type": "boolean"
        +          },
        +          "swatch_url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "colour_name",
        +          "in_stock"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "available_colours": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "colour_name": {
        +      "type": "string"
        +    },
        +    "exact_colour_match": {
        +      "type": "boolean"
        +    },
        +    "expected_restock": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "found": {
        +      "type": "boolean"
        +    },
        +    "in_stock": {
        +      "type": "boolean"
        +    },
        +    "matching_colours": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "colour_name": {
        +            "type": "string"
        +          },
        +          "in_stock": {
        +            "type": "boolean"
        +          },
        +          "swatch_url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "colour_name",
        +          "in_stock"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "product_id": {
        +      "type": "string"
        +    },
        +    "requires_exact_colour_selection": {
        +      "type": "boolean"
        +    },
        +    "swatch_url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "in_stock"
        +  ],
        +  "type": "object"
        +}
    • Changedcomplete_checkout1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "allOf": [
        +    {
        +      "if": {
        +        "properties": {
        +          "payment_url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "payment_url"
        +        ]
        +      },
        +      "then": {
        +        "required": [
        +          "total_zar",
        +          "currency",
        +          "payment_method"
        +        ]
        +      }
        +    }
        +  ],
        +  "properties": {
        +    "ap2": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "merchant_authorization": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "merchant_authorization"
        +      ],
        +      "type": "object"
        +    },
        +    "checkout_id": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "customer": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "address": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "city": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "email": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "phone": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "item_count": {
        +      "type": "number"
        +    },
        +    "items": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "colour": {
        +                "type": "string"
        +              },
        +              "finish": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "height": {
        +                "type": "number"
        +              },
        +              "mountType": {
        +                "type": "string"
        +              },
        +              "price": {
        +                "type": "number"
        +              },
        +              "productId": {
        +                "type": "string"
        +              },
        +              "productName": {
        +                "type": "string"
        +              },
        +              "quantity": {
        +                "type": "number"
        +              },
        +              "total": {
        +                "type": "number"
        +              },
        +              "width": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "payment_method": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_url": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "provider_reference": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "checkout_id",
        +    "status",
        +    "payment_url",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedconfigure_product5 fields changed
      • changedInput schema / properties / mount_type / description
        Previous value: -"Mount type: inside (recess) or outside (face-fix)"New value: +"Use inside (recess) or outside (face-fix); handler requires a nonempty value"
      • removedInput schema / properties / mount_type / enum
        Removed value: -[
        -  "inside",
        -  "outside"
        -]
      • addedInput schema / properties / mount_type / minLength
        Added value: +1
      • changedInput schema / properties / product_id / description
        Previous value: -"Product ID from search_products"New value: +"product_id from search_catalog or lookup_catalog"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "success": {
        +          "const": true
        +        }
        +      },
        +      "required": [
        +        "configuration"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "success": {
        +          "const": false
        +        }
        +      },
        +      "required": [
        +        "message"
        +      ]
        +    }
        +  ],
        +  "properties": {
        +    "configuration": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "category": {
        +          "type": "string"
        +        },
        +        "colour": {
        +          "type": "string"
        +        },
        +        "colour_hex": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "contact_name": {
        +          "type": "string"
        +        },
        +        "contact_phone": {
        +          "type": "string"
        +        },
        +        "contact_required": {
        +          "type": "boolean"
        +        },
        +        "currency": {
        +          "const": "ZAR",
        +          "type": "string"
        +        },
        +        "effective_height_mm": {
        +          "type": "number"
        +        },
        +        "effective_width_mm": {
        +          "type": "number"
        +        },
        +        "finish": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "height_mm": {
        +          "type": "number"
        +        },
        +        "lead_time": {
        +          "type": "string"
        +        },
        +        "material": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "measurement_review_required": {
        +          "type": "boolean"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "mount_type": {
        +          "type": "string"
        +        },
        +        "note": {
        +          "type": "string"
        +        },
        +        "product_id": {
        +          "type": "string"
        +        },
        +        "product_name": {
        +          "type": "string"
        +        },
        +        "product_url": {
        +          "type": "string"
        +        },
        +        "quantity": {
        +          "type": "number"
        +        },
        +        "success": {
        +          "type": "boolean"
        +        },
        +        "total_price_zar": {
        +          "type": "number"
        +        },
        +        "unit_price_zar": {
        +          "type": "number"
        +        },
        +        "vat_included": {
        +          "type": "boolean"
        +        },
        +        "whatsapp": {
        +          "type": "string"
        +        },
        +        "width_mm": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "product_id",
        +        "width_mm",
        +        "height_mm",
        +        "colour",
        +        "mount_type",
        +        "quantity",
        +        "unit_price_zar",
        +        "total_price_zar",
        +        "currency",
        +        "vat_included"
        +      ],
        +      "type": "object"
        +    },
        +    "contact_name": {
        +      "type": "string"
        +    },
        +    "contact_phone": {
        +      "type": "string"
        +    },
        +    "contact_required": {
        +      "type": "boolean"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_cart5 fields changed
      • removedInput schema / properties / customer / description
        Removed value: -"Optional customer details"
      • addedInput schema / properties / customer / properties
        Added value: +{
        +  "address": {
        +    "type": "string"
        +  },
        +  "city": {
        +    "type": "string"
        +  },
        +  "email": {
        +    "description": "Real customer email, checked before checkout creation",
        +    "type": "string"
        +  },
        +  "name": {
        +    "description": "Real customer name, checked before checkout creation",
        +    "type": "string"
        +  },
        +  "phone": {
        +    "description": "South African phone number, checked before checkout creation",
        +    "type": "string"
        +  }
        +}
      • changedInput schema / properties / items / description
        Previous value: -"Optional initial items (configured blinds)"New value: +"Optional configured items; all submitted prices are ignored"
      • addedInput schema / properties / items / items
        Added value: +{
        +  "properties": {
        +    "colour": {
        +      "description": "Exact available colour; validate with configure_product before adding",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "finish": {
        +      "description": "Optional pricing finish for aluminium Venetians",
        +      "type": "string"
        +    },
        +    "height_mm": {
        +      "description": "Actual ordered drop in millimetres",
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    "mount_type": {
        +      "description": "Use inside for recess fit or outside for face fix",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "product_id": {
        +      "description": "product_id returned by search_catalog or lookup_catalog",
        +      "type": "string"
        +    },
        +    "product_name": {
        +      "description": "Optional; server resolves the catalogue name",
        +      "type": "string"
        +    },
        +    "quantity": {
        +      "description": "Number of blinds; defaults to 1",
        +      "type": "number"
        +    },
        +    "total_price_zar": {
        +      "description": "Optional, ignored: server recalculates all totals",
        +      "type": "number"
        +    },
        +    "unit_price_zar": {
        +      "description": "Optional, ignored: server recalculates all prices",
        +      "type": "number"
        +    },
        +    "width_mm": {
        +      "description": "Actual ordered width in millimetres",
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "product_id",
        +    "width_mm",
        +    "height_mm",
        +    "colour",
        +    "mount_type"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "cart_id": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "type": "string"
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "customer": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {
        +            "address": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "city": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "email": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "phone": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            }
        +          },
        +          "required": [],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "expires_at": {
        +      "type": "string"
        +    },
        +    "item_count": {
        +      "type": "number"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "colour": {
        +            "type": "string"
        +          },
        +          "finish": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "height_mm": {
        +            "type": "number"
        +          },
        +          "mount_type": {
        +            "type": "string"
        +          },
        +          "product_id": {
        +            "type": "string"
        +          },
        +          "product_name": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "total_price_zar": {
        +            "type": "number"
        +          },
        +          "unit_price_zar": {
        +            "type": "number"
        +          },
        +          "width_mm": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "product_id",
        +          "width_mm",
        +          "height_mm",
        +          "quantity",
        +          "unit_price_zar",
        +          "total_price_zar"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    },
        +    "updated_at": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "cart_id",
        +    "items",
        +    "item_count",
        +    "total_zar",
        +    "currency",
        +    "customer",
        +    "created_at",
        +    "updated_at",
        +    "expires_at"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_checkout8 fields changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "cart_id"
        +    ]
        +  },
        +  {
        +    "properties": {
        +      "customer": {
        +        "required": [
        +          "name",
        +          "email",
        +          "phone"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "items",
        +      "customer"
        +    ]
        +  }
        +]
      • addedInput schema / properties / customer / properties / email / description
        Added value: +"Real customer email, checked before checkout creation"
      • addedInput schema / properties / customer / properties / name / description
        Added value: +"Real customer name, checked before checkout creation"
      • addedInput schema / properties / customer / properties / phone / description
        Added value: +"South African phone number, checked before checkout creation"
      • removedInput schema / properties / customer / required
        Removed value: -[
        -  "name",
        -  "email",
        -  "phone"
        -]
      • addedInput schema / properties / items / items
        Added value: +{
        +  "properties": {
        +    "colour": {
        +      "description": "Exact available colour; validate with configure_product before adding",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "finish": {
        +      "description": "Optional pricing finish for aluminium Venetians",
        +      "type": "string"
        +    },
        +    "height_mm": {
        +      "description": "Actual ordered drop in millimetres",
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    "mount_type": {
        +      "description": "Use inside for recess fit or outside for face fix",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "product_id": {
        +      "description": "product_id returned by search_catalog or lookup_catalog",
        +      "type": "string"
        +    },
        +    "product_name": {
        +      "description": "Optional; server resolves the catalogue name",
        +      "type": "string"
        +    },
        +    "quantity": {
        +      "description": "Number of blinds; defaults to 1",
        +      "type": "number"
        +    },
        +    "total_price_zar": {
        +      "description": "Optional, ignored: server recalculates all totals",
        +      "type": "number"
        +    },
        +    "unit_price_zar": {
        +      "description": "Optional, ignored: server recalculates all prices",
        +      "type": "number"
        +    },
        +    "width_mm": {
        +      "description": "Actual ordered width in millimetres",
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "product_id",
        +    "width_mm",
        +    "height_mm",
        +    "colour",
        +    "mount_type"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / items / minItems
        Added value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "ap2": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "merchant_authorization": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "merchant_authorization"
        +      ],
        +      "type": "object"
        +    },
        +    "checkout_id": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "customer": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "address": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "city": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "email": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "phone": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "item_count": {
        +      "type": "number"
        +    },
        +    "items": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "colour": {
        +                "type": "string"
        +              },
        +              "finish": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "height": {
        +                "type": "number"
        +              },
        +              "mountType": {
        +                "type": "string"
        +              },
        +              "price": {
        +                "type": "number"
        +              },
        +              "productId": {
        +                "type": "string"
        +              },
        +              "productName": {
        +                "type": "string"
        +              },
        +              "quantity": {
        +                "type": "number"
        +              },
        +              "total": {
        +                "type": "number"
        +              },
        +              "width": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "payment_method": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_url": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "provider_reference": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "checkout_id",
        +    "status",
        +    "total_zar",
        +    "currency"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_order4 fields changed
      • changedInput schema / properties / items / items / required
        Previous value: -[
        -  "product_id",
        -  "width_mm",
        -  "height_mm",
        -  "colour",
        -  "mount_type",
        -  "unit_price_zar",
        -  "total_price_zar"
        -]New value: +[
        +  "product_id",
        +  "width_mm",
        +  "height_mm",
        +  "colour",
        +  "mount_type"
        +]
      • addedInput schema / properties / items / minItems
        Added value: +1
      • addedInput schema / properties / payment_method
        Added value: +{
        +  "default": "yoco",
        +  "description": "Yoco card or Ozow instant EFT",
        +  "enum": [
        +    "yoco",
        +    "ozow"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "contact": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "contact_name": {
        +          "type": "string"
        +        },
        +        "contact_phone": {
        +          "type": "string"
        +        },
        +        "email": {
        +          "type": "string"
        +        },
        +        "note": {
        +          "type": "string"
        +        },
        +        "whatsapp": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "item_count": {
        +      "type": "number"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "order_id": {
        +      "type": "string"
        +    },
        +    "payment_url": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "success": {
        +      "type": "boolean"
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "order_id",
        +    "total_zar",
        +    "currency",
        +    "item_count",
        +    "payment_url",
        +    "message",
        +    "contact"
        +  ],
        +  "type": "object"
        +}
    • Changedget_ar_visualizer_url1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "ar_measurement_note": {
        +      "type": "string"
        +    },
        +    "ar_measurement_url": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "product_visualizer_note": {
        +      "type": "string"
        +    },
        +    "product_visualizer_url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "note"
        +  ],
        +  "type": "object"
        +}
    • Changedget_cart1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "cart_id": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "type": "string"
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "customer": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {
        +            "address": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "city": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "email": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "phone": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            }
        +          },
        +          "required": [],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "expires_at": {
        +      "type": "string"
        +    },
        +    "item_count": {
        +      "type": "number"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "colour": {
        +            "type": "string"
        +          },
        +          "finish": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "height_mm": {
        +            "type": "number"
        +          },
        +          "mount_type": {
        +            "type": "string"
        +          },
        +          "product_id": {
        +            "type": "string"
        +          },
        +          "product_name": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "total_price_zar": {
        +            "type": "number"
        +          },
        +          "unit_price_zar": {
        +            "type": "number"
        +          },
        +          "width_mm": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "product_id",
        +          "width_mm",
        +          "height_mm",
        +          "quantity",
        +          "unit_price_zar",
        +          "total_price_zar"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    },
        +    "updated_at": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "cart_id",
        +    "items",
        +    "item_count",
        +    "total_zar",
        +    "currency",
        +    "customer",
        +    "created_at",
        +    "updated_at",
        +    "expires_at"
        +  ],
        +  "type": "object"
        +}
    • Changedget_checkout1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "ap2": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "merchant_authorization": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "merchant_authorization"
        +      ],
        +      "type": "object"
        +    },
        +    "checkout_id": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "customer": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "address": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "city": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "email": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "phone": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "item_count": {
        +      "type": "number"
        +    },
        +    "items": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "colour": {
        +                "type": "string"
        +              },
        +              "finish": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "height": {
        +                "type": "number"
        +              },
        +              "mountType": {
        +                "type": "string"
        +              },
        +              "price": {
        +                "type": "number"
        +              },
        +              "productId": {
        +                "type": "string"
        +              },
        +              "productName": {
        +                "type": "string"
        +              },
        +              "quantity": {
        +                "type": "number"
        +              },
        +              "total": {
        +                "type": "number"
        +              },
        +              "width": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "payment_method": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_url": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "provider_reference": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "checkout_id",
        +    "status",
        +    "total_zar",
        +    "currency"
        +  ],
        +  "type": "object"
        +}
    • Changedget_delivery_estimate1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "delivery_after_dispatch": {
        +      "type": "string"
        +    },
        +    "estimated_dispatch_date": {
        +      "type": "string"
        +    },
        +    "expedited_available": {
        +      "type": "boolean"
        +    },
        +    "important": {
        +      "type": "string"
        +    },
        +    "order_date": {
        +      "type": "string"
        +    },
        +    "production_working_days": {
        +      "type": "number"
        +    },
        +    "summary": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "order_date",
        +    "production_working_days",
        +    "estimated_dispatch_date",
        +    "delivery_after_dispatch",
        +    "expedited_available",
        +    "summary",
        +    "important"
        +  ],
        +  "type": "object"
        +}
    • Changedget_order1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "created_at": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "customer": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "address": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "city": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "email": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "phone": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "items": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "colour": {
        +                "type": "string"
        +              },
        +              "finish": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "height": {
        +                "type": "number"
        +              },
        +              "mountType": {
        +                "type": "string"
        +              },
        +              "price": {
        +                "type": "number"
        +              },
        +              "productId": {
        +                "type": "string"
        +              },
        +              "productName": {
        +                "type": "string"
        +              },
        +              "quantity": {
        +                "type": "number"
        +              },
        +              "total": {
        +                "type": "number"
        +              },
        +              "width": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "order_id": {
        +      "type": "string"
        +    },
        +    "payment_method": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "order_id"
        +  ],
        +  "type": "object"
        +}
    • Changedget_payment_methods1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "default_currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "handlers": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "display_name": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "methods": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "redirect": {
        +            "type": "boolean"
        +          },
        +          "supports_3ds": {
        +            "type": "boolean"
        +          },
        +          "supports_banks": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "webhook_verified": {
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "display_name",
        +          "methods",
        +          "redirect",
        +          "webhook_verified"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "note": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "default_currency",
        +    "handlers",
        +    "note"
        +  ],
        +  "type": "object"
        +}
    • Changedget_price3 fields changed
      • addedInput schema / properties / colour
        Added value: +{
        +  "description": "Optional bamboo colour for colour-specific tier pricing",
        +  "type": "string"
        +}
      • changedInput schema / properties / product_id / description
        Previous value: -"Product ID from search_products (e.g. roller-blockout, venetian-25mm-aluminium)"New value: +"product_id from search_catalog or lookup_catalog (e.g. roller-blockout)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "success": {
        +          "const": true
        +        }
        +      },
        +      "required": [
        +        "product_id",
        +        "width_mm",
        +        "height_mm",
        +        "quantity",
        +        "unit_price_zar",
        +        "total_price_zar",
        +        "currency",
        +        "vat_included"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "success": {
        +          "const": false
        +        }
        +      },
        +      "required": [
        +        "message"
        +      ]
        +    }
        +  ],
        +  "properties": {
        +    "contact_name": {
        +      "type": "string"
        +    },
        +    "contact_phone": {
        +      "type": "string"
        +    },
        +    "contact_required": {
        +      "type": "boolean"
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "effective_height_mm": {
        +      "type": "number"
        +    },
        +    "effective_width_mm": {
        +      "type": "number"
        +    },
        +    "finish": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "height_mm": {
        +      "type": "number"
        +    },
        +    "lead_time": {
        +      "type": "string"
        +    },
        +    "measurement_review_required": {
        +      "type": "boolean"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "product_id": {
        +      "type": "string"
        +    },
        +    "quantity": {
        +      "type": "number"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    },
        +    "total_price_zar": {
        +      "type": "number"
        +    },
        +    "unit_price_zar": {
        +      "type": "number"
        +    },
        +    "vat_included": {
        +      "type": "boolean"
        +    },
        +    "whatsapp": {
        +      "type": "string"
        +    },
        +    "width_mm": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "success"
        +  ],
        +  "type": "object"
        +}
    • Changedget_product1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "product": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "category": {
        +          "type": "string"
        +        },
        +        "colour_count_in_stock": {
        +          "type": "number"
        +        },
        +        "colours": {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "expected_restock": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "finish": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "hex": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "in_stock": {
        +                "type": "boolean"
        +              },
        +              "material": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "name": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "description": {
        +          "type": "string"
        +        },
        +        "features": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "installation_type": {
        +          "type": "string"
        +        },
        +        "materials": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "max_height_mm": {
        +          "type": "number"
        +        },
        +        "max_width_mm": {
        +          "type": "number"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "product_id": {
        +          "type": "string"
        +        },
        +        "product_url": {
        +          "type": "string"
        +        },
        +        "schema_url": {
        +          "type": "string"
        +        },
        +        "size_limits": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "availability_rule": {
        +              "type": "string"
        +            },
        +            "combination_dependent": {
        +              "type": "boolean"
        +            },
        +            "max_height_mm": {
        +              "type": "number"
        +            },
        +            "max_width_mm": {
        +              "type": "number"
        +            },
        +            "measurement_note": {
        +              "type": "string"
        +            },
        +            "minimum_charge_height_mm": {
        +              "type": "number"
        +            },
        +            "minimum_charge_width_mm": {
        +              "type": "number"
        +            },
        +            "product_id": {
        +              "type": "string"
        +            },
        +            "unit": {
        +              "const": "mm",
        +              "type": "string"
        +            },
        +            "validation_note": {
        +              "type": "string"
        +            },
        +            "width_drop_frontier": {
        +              "items": {
        +                "additionalProperties": true,
        +                "properties": {
        +                  "max_drop_mm": {
        +                    "type": "number"
        +                  },
        +                  "width_band_max_mm": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "width_band_max_mm",
        +                  "max_drop_mm"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "product_id",
        +            "unit",
        +            "max_width_mm",
        +            "max_height_mm",
        +            "minimum_charge_width_mm",
        +            "minimum_charge_height_mm",
        +            "combination_dependent",
        +            "availability_rule",
        +            "width_drop_frontier",
        +            "measurement_note",
        +            "validation_note"
        +          ],
        +          "type": "object"
        +        },
        +        "suitable_for": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "product_id",
        +        "name",
        +        "category",
        +        "colours",
        +        "product_url"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "product"
        +  ],
        +  "type": "object"
        +}
    • Changedget_product_recommendation1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "handoff": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "product_family": {
        +          "type": "string"
        +        },
        +        "reason": {
        +          "type": "string"
        +        },
        +        "url": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "url",
        +        "product_family",
        +        "reason"
        +      ],
        +      "type": "object"
        +    },
        +    "notes": {
        +      "type": "string"
        +    },
        +    "recommendations": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "currency": {
        +            "const": "ZAR",
        +            "type": "string"
        +          },
        +          "product_id": {
        +            "type": "string"
        +          },
        +          "product_name": {
        +            "type": "string"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "shop_url": {
        +            "type": "string"
        +          },
        +          "starting_price_zar_for_1m_x_1m": {
        +            "anyOf": [
        +              {
        +                "type": "number"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "product_id",
        +          "product_name",
        +          "reason",
        +          "starting_price_zar_for_1m_x_1m",
        +          "currency",
        +          "shop_url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "recommendations"
        +  ],
        +  "type": "object"
        +}
    • Changedget_whatsapp_handoff1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "reason": {
        +      "type": "string"
        +    },
        +    "recipient": {
        +      "type": "string"
        +    },
        +    "recipient_phone": {
        +      "type": "string"
        +    },
        +    "whatsapp_url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "whatsapp_url",
        +    "recipient",
        +    "recipient_phone",
        +    "reason"
        +  ],
        +  "type": "object"
        +}
    • Changedlookup_catalog1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "results": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "category": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "product_id": {
        +            "type": "string"
        +          },
        +          "product_url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "product_id",
        +          "name",
        +          "category",
        +          "product_url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedrequest_price_match1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "claim_summary": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "competitor": {
        +          "type": "string"
        +        },
        +        "competitor_price_zar": {
        +          "type": "string"
        +        },
        +        "dimensions": {
        +          "type": "string"
        +        },
        +        "product_id": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "product_id",
        +        "dimensions",
        +        "competitor",
        +        "competitor_price_zar"
        +      ],
        +      "type": "object"
        +    },
        +    "exclusions": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    },
        +    "whatsapp_url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "claim_summary",
        +    "whatsapp_url",
        +    "message",
        +    "exclusions",
        +    "note"
        +  ],
        +  "type": "object"
        +}
    • Changedrequest_swatch2 fields changed
      • changedInput schema / properties / swatch_codes / description
        Previous value: -"Optional specific colour codes (max 5)"New value: +"Optional specific colour codes; no count limit enforced by this handler"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "estimated_delivery_days": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "max": {
        +          "type": "number"
        +        },
        +        "min": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "min",
        +        "max"
        +      ],
        +      "type": "object"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "request_id": {
        +      "type": "number"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "swatch_count": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "request_id",
        +    "status",
        +    "estimated_delivery_days",
        +    "swatch_count",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_catalog1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "category": {
        +            "type": "string"
        +          },
        +          "colour_count_in_stock": {
        +            "type": "number"
        +          },
        +          "description": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "product_id": {
        +            "type": "string"
        +          },
        +          "product_url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "product_id",
        +          "name",
        +          "category",
        +          "description",
        +          "product_url",
        +          "colour_count_in_stock"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "total",
        +    "currency"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_products1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "contact_name": {
        +      "type": "string"
        +    },
        +    "contact_phone": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "products": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "category": {
        +            "type": "string"
        +          },
        +          "colour_count": {
        +            "type": "number"
        +          },
        +          "description": {
        +            "type": "string"
        +          },
        +          "features": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "installation_type": {
        +            "type": "string"
        +          },
        +          "materials": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "product_url": {
        +            "type": "string"
        +          },
        +          "suitable_for": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "category",
        +          "product_url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "products",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedsubmit_enquiry4 fields changed
      • changedInput schema / properties / message / description
        Previous value: -"Additional message or questions from the customer"New value: +"Required enquiry message; at least 10 characters after trimming"
      • addedInput schema / properties / message / minLength
        Added value: +10
      • changedInput schema / required
        Previous value: -[
        -  "product_config",
        -  "customer_name",
        -  "customer_email",
        -  "customer_phone"
        -]New value: +[
        +  "product_config",
        +  "customer_name",
        +  "customer_email",
        +  "customer_phone",
        +  "message"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "contact": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "contact_name": {
        +          "type": "string"
        +        },
        +        "contact_phone": {
        +          "type": "string"
        +        },
        +        "email": {
        +          "type": "string"
        +        },
        +        "note": {
        +          "type": "string"
        +        },
        +        "whatsapp": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "enquiry_id": {
        +      "type": "string"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "enquiry_id",
        +    "message",
        +    "contact"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_cart4 fields changed
      • addedInput schema / properties / customer / properties
        Added value: +{
        +  "address": {
        +    "type": "string"
        +  },
        +  "city": {
        +    "type": "string"
        +  },
        +  "email": {
        +    "description": "Real customer email, checked before checkout creation",
        +    "type": "string"
        +  },
        +  "name": {
        +    "description": "Real customer name, checked before checkout creation",
        +    "type": "string"
        +  },
        +  "phone": {
        +    "description": "South African phone number, checked before checkout creation",
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / items / items
        Added value: +{
        +  "properties": {
        +    "colour": {
        +      "description": "Exact available colour; validate with configure_product before adding",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "finish": {
        +      "description": "Optional pricing finish for aluminium Venetians",
        +      "type": "string"
        +    },
        +    "height_mm": {
        +      "description": "Actual ordered drop in millimetres",
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    },
        +    "mount_type": {
        +      "description": "Use inside for recess fit or outside for face fix",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "product_id": {
        +      "description": "product_id returned by search_catalog or lookup_catalog",
        +      "type": "string"
        +    },
        +    "product_name": {
        +      "description": "Optional; server resolves the catalogue name",
        +      "type": "string"
        +    },
        +    "quantity": {
        +      "description": "Number of blinds; defaults to 1",
        +      "type": "number"
        +    },
        +    "total_price_zar": {
        +      "description": "Optional, ignored: server recalculates all totals",
        +      "type": "number"
        +    },
        +    "unit_price_zar": {
        +      "description": "Optional, ignored: server recalculates all prices",
        +      "type": "number"
        +    },
        +    "width_mm": {
        +      "description": "Actual ordered width in millimetres",
        +      "exclusiveMinimum": 0,
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "product_id",
        +    "width_mm",
        +    "height_mm",
        +    "colour",
        +    "mount_type"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / op / default
        Added value: +"set"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "cart_id": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "type": "string"
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "customer": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {
        +            "address": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "city": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "email": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "phone": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            }
        +          },
        +          "required": [],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "expires_at": {
        +      "type": "string"
        +    },
        +    "item_count": {
        +      "type": "number"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "colour": {
        +            "type": "string"
        +          },
        +          "finish": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "height_mm": {
        +            "type": "number"
        +          },
        +          "mount_type": {
        +            "type": "string"
        +          },
        +          "product_id": {
        +            "type": "string"
        +          },
        +          "product_name": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "total_price_zar": {
        +            "type": "number"
        +          },
        +          "unit_price_zar": {
        +            "type": "number"
        +          },
        +          "width_mm": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "product_id",
        +          "width_mm",
        +          "height_mm",
        +          "quantity",
        +          "unit_price_zar",
        +          "total_price_zar"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    },
        +    "updated_at": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "cart_id",
        +    "items",
        +    "item_count",
        +    "total_zar",
        +    "currency",
        +    "customer",
        +    "created_at",
        +    "updated_at",
        +    "expires_at"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_checkout2 fields changed
      • addedInput schema / properties / customer / properties
        Added value: +{
        +  "address": {
        +    "type": "string"
        +  },
        +  "city": {
        +    "type": "string"
        +  },
        +  "email": {
        +    "description": "Real customer email, checked before checkout creation",
        +    "type": "string"
        +  },
        +  "name": {
        +    "description": "Real customer name, checked before checkout creation",
        +    "type": "string"
        +  },
        +  "phone": {
        +    "description": "South African phone number, checked before checkout creation",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "ap2": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "merchant_authorization": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "merchant_authorization"
        +      ],
        +      "type": "object"
        +    },
        +    "checkout_id": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "currency": {
        +      "const": "ZAR",
        +      "type": "string"
        +    },
        +    "customer": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "address": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "city": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "email": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "phone": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        }
        +      },
        +      "required": [],
        +      "type": "object"
        +    },
        +    "item_count": {
        +      "type": "number"
        +    },
        +    "items": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "colour": {
        +                "type": "string"
        +              },
        +              "finish": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "height": {
        +                "type": "number"
        +              },
        +              "mountType": {
        +                "type": "string"
        +              },
        +              "price": {
        +                "type": "number"
        +              },
        +              "productId": {
        +                "type": "string"
        +              },
        +              "productName": {
        +                "type": "string"
        +              },
        +              "quantity": {
        +                "type": "number"
        +              },
        +              "total": {
        +                "type": "number"
        +              },
        +              "width": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "payment_method": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "payment_url": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "provider_reference": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "total_zar": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "checkout_id",
        +    "status",
        +    "total_zar",
        +    "currency"
        +  ],
        +  "type": "object"
        +}
  5. 26 tool updates
    • First observedcancel_cart
    • First observedcancel_checkout
    • First observedcheck_colour_stock
    • First observedcomplete_checkout
    • First observedconfigure_product
    • First observedcreate_cart
    • First observedcreate_checkout
    • First observedcreate_order
    • First observedget_ar_visualizer_url
    • First observedget_cart
    • First observedget_checkout
    • First observedget_delivery_estimate
    • First observedget_order
    • First observedget_payment_methods
    • First observedget_price
    • First observedget_product
    • First observedget_product_recommendation
    • First observedget_whatsapp_handoff
    • First observedlookup_catalog
    • First observedrequest_price_match
    • First observedrequest_swatch
    • First observedsearch_catalog
    • First observedsearch_products
    • First observedsubmit_enquiry
    • First observedupdate_cart
    • First observedupdate_checkout

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to search enterprise Auto-ID products and exact SKUs, read live stock and current pricing, and explore variants, accessories, consumables and support relationships through a public read-only endpoint. It also surfaces manuals, firmware, drivers and other verified technical resources from the vendor's support center.
    -
  • A
    license
    B
    quality
    B
    maintenance
    AI assistant tools for building high-converting immersive commerce showrooms from an existing e-commerce catalog. Built on Mantis XR's production immersive-commerce platform, used by Fortune 500 brands including New Balance, with deployments spanning the Paris 2024 Olympics, MLB (Chicago Cubs), NHL (St. Louis Blues), and the Premier League (Burnley FC and other clubs).
    14
    34 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.