← All action domains

Commerce

43 operations. Call each with POST https://app.chirply.io/api/v1/actions/<name> and a bearer token; the response is { "data": { "action", "summary", "result" } }. A read badge means the operation changes nothing; write requires the credential’s write scope.

Add to cart

commerce.add_to_cartwrite

Add a product to a shopping cart on the public storefront, starting a new cart when no token is given. The product must be active and published on the storefront, a product with options requires a variant_id, and the request is refused when tracked stock would be exceeded. Nothing is charged and no stock is held — this only builds the cart; money moves at commerce.checkout. ALWAYS keep the cart_token it returns: it is how every later call finds this cart.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)optionalWhich storefront to shop. Optional — an account has one store, so this defaults to it.
cart_tokenstringoptionalAn existing cart to add to. Omit to start a new cart; the new token comes back in the result.
product_idstring (uuid)requiredCatalogue product to add, from commerce.list_products. It must have storefront status 'active'.
variant_idstring (uuid) (or null)optionalWhich size/colour/option combination to add, from commerce.list_variants. Required when the product has variants; null or omitted otherwise.
quantityintegeroptionalHow many units to add. This is ADDED to whatever quantity of the same line is already in the cart. Default: 1

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.add_to_cart \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_add_to_cart at https://app.chirply.io/api/mcp, same bearer token, same input.

Adjust inventory

commerce.adjust_inventorywriteconfirm

Add or remove sellable product inventory and record the manual adjustment in the stock ledger. This can make an item available or sold out immediately on a live storefront. IMPORTANT SIDE EFFECT: it also switches stock tracking ON for that product permanently, even if it was selling with tracking off — so from then on the count is enforced, and a product whose inventory policy is 'deny' will REFUSE real customer orders as soon as the count reaches zero.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
product_idstring (uuid)requiredProduct whose stock changes.
deltaintegerrequiredSigned quantity change; positive adds stock and negative removes it.
notestringoptionalWhy this manual stock change was made.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.adjust_inventory \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "delta": 1
  }'
Test with your API key

Over MCP the same operation is the tool commerce_adjust_inventory at https://app.chirply.io/api/mcp, same bearer token, same input.

Apply discount code

commerce.apply_discount_codewrite

Apply a discount code to a storefront cart, or clear the one already on it. The code is checked against the store's active discounts on the server and rejected if it isn't valid, so this is also how you test whether a code works. The saving is recalculated into the cart's totals and will really be taken off the customer's charge at checkout. Nothing is charged here.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)optionalWhich storefront to shop. Optional — an account has one store, so this defaults to it.
cart_tokenstringrequiredThe cart's token, as returned by commerce.add_to_cart. A shopper's browser keeps this in a cookie; a machine caller has to carry it between calls. Carts expire, after which a new one must be started.
discount_codestring (or null)requiredThe code the shopper typed, matched case-insensitively against the store's active discounts. Pass null to remove the code currently on the cart.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.apply_discount_code \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "cart_token": "example",
    "discount_code": "example"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_apply_discount_code at https://app.chirply.io/api/mcp, same bearer token, same input.

Use this domain

commerce.attach_domainwriteconfirmadmin only

Make an already-connected, unused account domain the store's public address. This immediately changes public routing when the domain is active and replaces any prior custom address on this store; it does not modify registrar ownership.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)requiredNative Commerce store that will use the domain.
domain_idstring (uuid)requiredConnected account domain to attach. It must not serve a funnel, directory or another store.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.attach_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_attach_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

Cancel store order

commerce.cancel_orderwriteconfirmadmin only

Cancel a store or funnel order. An UNPAID order's pending Stripe payment is cancelled so it can never be charged, and the stock it held is released. A PAID order is marked cancelled and, when refund is true, everything not yet refunded is refunded on the seller's OWN Stripe account — REAL MONEY back to the buyer, irreversible; with refund false the money stays with the seller. restock puts units that were not already refunded back on tracked inventory. A subscription order must have its subscription cancelled first (commerce.cancel_subscription). Fires order_cancelled (and order_refunded when it refunds), starting matching automations and notifying webhook subscribers. Cancelling an already-cancelled order does nothing.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe order to cancel — a store order from commerce.list_orders, or a funnel order.
refundbooleanrequiredFor a paid order: true refunds everything not yet refunded (real money), false cancels without refunding. Ignored for unpaid orders. Required, so the decision is always explicit.
restockbooleanoptionalPut units that hadn't already been refunded back on tracked inventory so they can be sold again. Default: true
reasonstringoptionalWhy the order was cancelled, e.g. 'Event postponed'. Recorded on the order and included in the order_cancelled event.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.cancel_order \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "refund": true
  }'
Test with your API key

Over MCP the same operation is the tool commerce_cancel_order at https://app.chirply.io/api/mcp, same bearer token, same input.

Cancel subscription

commerce.cancel_subscriptionwriteconfirmadmin only

Cancel a customer's recurring subscription on the seller's OWN Stripe account. This stops REAL future charges to a real customer's card: with at_period_end (the default) they keep what they paid for until the current billing period runs out and are never charged again; with at_period_end false the subscription ends IMMEDIATELY, any member access the purchase granted is revoked right away, and no refund of the current period is issued by this action. It does not delete the customer, the order history, or any member data.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
order_idstring (uuid)requiredThe recurring order whose subscription to cancel, from commerce.list_subscriptions.
at_period_endbooleanoptionaltrue (default) lets the customer keep access until the paid period ends, then stops billing. false cancels and revokes granted member access immediately, without refunding the current period. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.cancel_subscription \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "order_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_cancel_subscription at https://app.chirply.io/api/mcp, same bearer token, same input.

Checkout

commerce.checkoutwriteconfirm

Place a REAL order for the contents of a storefront cart. This is the point of no return on the buyer's path: it re-prices every line, HOLDS the tracked stock so nobody else can buy it, creates a real pending order in the seller's books, creates or updates a CRM contact for the buyer from their email, and opens a live Stripe payment for the full total on the seller's OWN Stripe account (test mode only if the store is set to test). It returns that payment's client secret — the card is charged the moment that secret is confirmed, which for a shopper is them clicking Pay. Use only with a real buyer's real details and a total they have agreed to.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)optionalWhich storefront to shop. Optional — an account has one store, so this defaults to it.
cart_tokenstringrequiredThe cart's token, as returned by commerce.add_to_cart. A shopper's browser keeps this in a cookie; a machine caller has to carry it between calls. Carts expire, after which a new one must be started.
buyer_emailstring (email)requiredThe buyer's email address. Required — the receipt goes here and it is what the CRM contact is matched or created on.
buyer_namestringoptionalThe buyer's full name, as it should appear on the order.
buyer_phonestringoptionalThe buyer's phone number, any format.
shipping_addressobjectoptionalWhere physical goods are delivered. Required in practice for any cart containing a product that needs shipping.
shipping_address.line1stringrequiredStreet address, first line.
shipping_address.line2stringoptionalApartment, suite, unit — the second address line.
shipping_address.citystringrequiredTown or city.
shipping_address.regionstringoptionalState, province or region.
shipping_address.postal_codestringoptionalPostal or ZIP code.
shipping_address.countrystringoptionalTwo-letter ISO country code, e.g. 'GB'. Omit for the store's default checkout country.
customer_notestringoptionalA note from the buyer for the seller, shown on the order.
accept_termsbooleanoptionalThe buyer has read and accepts the store's terms. REQUIRED as true when the store requires terms (see policies.terms on commerce.get_store) — checkout is refused without it, and the acceptance, its time and the terms URL/version are recorded on the order. Only set it when the real buyer has actually agreed.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.checkout \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "cart_token": "example",
    "buyer_email": "ada@example.com"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_checkout at https://app.chirply.io/api/mcp, same bearer token, same input.

Connect domain

commerce.connect_domainwriteconfirmadmin only

Connect a customer-owned hostname through the platform's Cloudflare for SaaS service and make it this store's public address. This changes public routing and may automatically create a CNAME in its connected Cloudflare account; it does not purchase a domain.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)requiredNative Commerce store that will be served from the hostname.
domainstringrequiredCustomer-owned hostname, such as shop.example.com. A pasted https:// URL is accepted and normalized.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.connect_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "domain": "example"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_connect_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

Create collection

commerce.create_collectionwrite

Create a storefront collection. Products can be included immediately with product_ids, or assigned or changed later with commerce.set_collection_products, without changing or duplicating the products themselves.

Parameters

FieldTypeRequiredDescription
namestringrequiredCustomer-facing collection name.
slugstringrequiredAccount-unique collection URL handle.
descriptionstringoptionalCustomer-facing collection description.
image_urlstring (uri)optionalPublic collection cover image URL.
is_visiblebooleanoptionalWhether shoppers can browse this collection. Default: true
sort_order"manual" | "newest" | "price_asc" | "price_desc" | "name"optionalHow products are ordered in the collection. Default: "manual"
product_idsarray of (string (uuid))optionalProducts to put in the collection immediately, in display order for 'manual' sort. Every id must be one of this account's own products. Omit to create an empty collection and populate it later with commerce.set_collection_products.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.create_collection \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example",
    "slug": "example"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_create_collection at https://app.chirply.io/api/mcp, same bearer token, same input.

Activate discount

commerce.create_discountwriteconfirm

Create a discount code and put it LIVE immediately. Every code created here starts ACTIVE, applies to EVERY product in the store, and — unless you set usage_limit — can be redeemed an UNLIMITED number of times by anyone who learns the code. It comes straight off what real customers pay at storefront checkout, so a percentage value of 10000 basis points is a 100%-off code that gives the whole catalogue away for free. There is no draft state and no approval step after this call: use commerce.pause_discount to stop one.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
codestringrequiredCase-insensitive code customers enter at checkout. Stored uppercase. Anyone who learns it can use it.
namestringrequiredInternal name explaining the offer. Customers never see this.
discount_type"percentage" | "fixed_amount" | "free_shipping"requiredHow the discount changes the order: a percentage off the eligible subtotal, a flat amount off, or free shipping.
value_amountintegerrequiredBasis points for percentage discounts (2000 = 20%, 10000 = 100% i.e. FREE), or the smallest currency unit for fixed discounts (500 = $5.00). Ignored for free_shipping. There is no upper bound — check this number before calling.
currencystringoptionalThree-letter ISO currency code for a fixed-amount discount. Default: "usd"
minimum_amountintegeroptionalMinimum order subtotal, in the smallest currency unit, before the code is allowed. 0 (the default) means it applies to any order however small. Default: 0
usage_limitintegeroptionalMaximum redemptions across ALL customers. Omit this and the code is UNLIMITED — set it unless you truly mean that.
starts_atstring (date-time)optionalISO 8601 time the code becomes usable; defaults to right now.
ends_atstring (date-time)optionalISO 8601 time the code stops working. Omit and it never expires on its own.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.create_discount \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "example",
    "name": "Example",
    "discount_type": "percentage",
    "value_amount": 1
  }'
Test with your API key

Over MCP the same operation is the tool commerce_create_discount at https://app.chirply.io/api/mcp, same bearer token, same input.

Create product

commerce.create_productwrite

Create a reusable catalog product for storefronts and funnels. Active products become sellable immediately when the storefront is published.

Parameters

FieldTypeRequiredDescription
namestringrequiredCustomer-facing product name.
slugstringrequiredAccount-unique product URL handle.
descriptionstringoptionalCustomer-facing product description.
image_urlstring (uri)optionalPrimary public product image URL.
product_type"physical" | "digital" | "service"optionalWhether this is a physical good, digital product or service. Default: "physical"
kind"one_time" | "recurring"optionalOne-time purchase, or 'recurring' for a subscription that charges the buyer's card automatically on a schedule until they cancel. Default: "one_time"
recurring_interval"day" | "week" | "month" | "year"optionalFor recurring products: the billing period unit. '$49/month' is interval 'month' with count 1. Ignored for one-time products. Default: "month"
recurring_interval_countintegeroptionalFor recurring products: how many intervals between charges — 3 with interval 'month' bills every 3 months. Ignored for one-time products. Default: 1
grants_access_product_idstring (uuid)optionalMember access product (from members.list_products) granted to the buyer automatically when their payment settles, and suspended/revoked if their subscription later fails or ends. Omit for a purchase that unlocks no member content.
currencystringoptionalThree-letter ISO currency code. Omit to use the store's currency (or the account's currency when there is no store yet).
price_amountintegerrequiredRegular selling price in the currency's smallest unit, such as cents (pence). When the store's tax is on this is tax-inclusive or tax-exclusive according to the store's prices_include_tax setting.
compare_at_amountintegeroptionalOptional original/strikethrough price in the smallest currency unit.
tax_rate_idstring (or null)optionalWhich of the store's tax rates (commerce.get_tax_settings) this item is charged at. Null or omitted uses the default — the store's default rate for a product, the product's rate for a variant. Ignored while the store's tax is off.
sale_price_amountinteger (or null)optionalA sale price in the smallest currency unit, lower than the regular price. While the sale window is open it is what shoppers pay on the storefront (shown with the regular price struck through); outside it the regular price applies automatically. One-time products only. Null removes the sale (and its dates). Funnel checkouts are not affected.
sale_starts_atstring (or null)optionalWhen the sale price starts applying (inclusive). Omit/null for "now". Either an ISO 8601 instant with an offset (2026-10-31T23:59:00+01:00), or a local date-time WITHOUT an offset (2026-10-31T23:59), which is read in the store's own timezone — DST included. Null clears it.
sale_ends_atstring (or null)optionalWhen the sale ends — the regular price applies from this instant on (exclusive end). Omit/null for no end. Either an ISO 8601 instant with an offset (2026-10-31T23:59:00+01:00), or a local date-time WITHOUT an offset (2026-10-31T23:59), which is read in the store's own timezone — DST included. Null clears it.
skustringoptionalAccount-unique stock-keeping unit.
vendorstringoptionalBrand or vendor shown to customers.
tagsstring[]optionalSearchable merchandising tags. Default: []
requires_shippingbooleanoptionalWhether checkout must collect a delivery address. Default: true
track_inventorybooleanoptionalWhether successful sales decrement stock. Default: false
inventory_quantityintegeroptionalStarting sellable units; may be negative only when overselling is allowed. Default: 0
inventory_policy"deny" | "continue"optionaldeny stops sales at zero; continue allows backorders. Default: "deny"
low_stock_thresholdintegeroptionalQuantity at which the product is flagged as low stock. Default: 5
storefront_status"draft" | "active" | "archived"optionaldraft hides it, active sells it, archived retires it. Default: "draft"
stripe_account_idstring (uuid)optionalConnected Stripe account override for this product.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.create_product \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example",
    "slug": "example",
    "price_amount": 1
  }'
Test with your API key

Over MCP the same operation is the tool commerce_create_product at https://app.chirply.io/api/mcp, same bearer token, same input.

Create store

commerce.create_storewrite

Create the account's storefront in draft. It remains private until Publish store is run. Regional settings default from the account's business profile country: a GB account's store starts in GBP with a GB checkout address, VAT-inclusive pricing and the UK rate presets loaded (an IE account: EUR, IE and the Irish presets); tax itself stays OFF until it is turned on. Any field given here overrides those defaults.

Parameters

FieldTypeRequiredDescription
namestringrequiredCustomer-facing store name.
slugstringrequiredPublic URL handle base using lowercase letters, numbers and hyphens. A 6-character suffix unique to this account is appended automatically — the same scheme the app's own 'Create store' button uses — so this can never collide with another account's store slug.
descriptionstringoptionalShort customer-facing store description.
currencystringoptionalThree-letter ISO currency code. Omit to use the account's currency: its explicit business currency, else its business country's (GB → gbp, IE → eur), else the connected Stripe account's default, else usd.
accent_colorstringoptionalStore signature color as a six-digit hex value. Default: "#315efb"
stripe_account_idstring (uuid)optionalConnected Stripe account that will collect store payments.
payment_mode"live" | "test"optionalWhether checkout moves real money or uses Stripe test mode. Default: "live"
tax_enabledbooleanoptionalTurn tax on or off for the storefront. When on, every cart and checkout calculates tax per line from the store's rates, and paid orders get a tax receipt with a sequential invoice number. Turning it on requires at least one rate and a default rate. Changes what real customers are charged from the next page load when prices are tax-exclusive.
prices_include_taxbooleanoptionaltrue: product prices are entered tax-inclusive (the shelf price is what the buyer pays and the tax is the part inside it — normal for UK/EU consumer pricing). false: prices are net and tax is added on top at checkout.
tax_labelstring (or null)optionalWhat the tax is called on the storefront and receipts, e.g. VAT, GST or Tax. Null uses the default for the store's currency.
tax_ratesobject[]optionalFULL REPLACEMENT of the store's tax rates. Rates left out are deleted; products pointing at a deleted rate fall back to the default rate. Past orders keep the rate they were charged at.
tax_rates[].idstringoptionalThe rate's id. When editing, keep an existing rate's id — products point at rates by id, so a changed id detaches them (they fall back to the default rate). Omit for a new rate and one is generated.
tax_rates[].namestringrequiredThe label printed on receipts and exports, e.g. 'UK Standard 20%'.
tax_rates[].rate_percentnumberoptionalThe percentage as typed, e.g. 20 or 13.5. Ignored — always 0 — when treatment is zero or exempt. Default: 0
tax_rates[].treatment"standard" | "zero" | "exempt"optionalstandard: the percentage applies. zero: zero-rated, charged at 0%. exempt: exempt, no tax. Zero-rated and exempt both charge nothing but are recorded separately on receipts and exports. Default: "standard"
tax_rates[].countrystring (or null)optionalTwo-letter country the rate belongs to (GB, IE…), used for grouping only.
add_preset_rates"GB" | "IE"optionalAppend a labelled preset list: GB adds UK Standard 20%, Reduced 5%, Zero-rated 0% and Exempt; IE adds Ireland Standard 23%, Reduced 13.5%, Second reduced 9%, Zero 0% and Exempt. Rates already present (same id) are skipped. Presets are starting points; which rate a product falls under is the seller's decision.
default_tax_rate_idstring (or null)optionalId of the rate applied to every product (and variant) that does not name its own. Must be one of the store's rates.
timezonestringoptionalIANA timezone of the store, e.g. Europe/London. Sale start and end times typed without an offset are read in this zone, and storefront and receipt dates are shown in it.
checkout_countrystring (or null)optionalTwo-letter country the checkout address form opens on, e.g. GB. Null keeps the US default.
supplierobjectoptionalSupplier details printed on receipts. Only the fields sent change; send null to clear one.
supplier.legal_namestring (or null)optionalThe supplier's legal name, printed at the top of every tax receipt.
supplier.trading_namestring (or null)optionalTrading name, when different from the legal name.
supplier.address_line1string (or null)optionalSupplier address, first line.
supplier.address_line2string (or null)optionalSupplier address, second line.
supplier.citystring (or null)optionalSupplier town or city.
supplier.regionstring (or null)optionalSupplier county, state or region.
supplier.postal_codestring (or null)optionalSupplier postcode.
supplier.countrystring (or null)optionalSupplier country, as it should be printed.
supplier.vat_numberstring (or null)optionalThe supplier's VAT (or other tax) registration number, printed on tax receipts.
supplier.company_numberstring (or null)optionalCompany registration number, printed when set.
supplier.registered_officestring (or null)optionalRegistered office address, printed when set.
invoice_prefixstringoptionalText before every invoice number, e.g. 'INV-' gives INV-00001. Changing it affects invoices issued from now on only.
next_invoice_numberintegeroptionalThe number the next invoice will get. It can only be moved UP (for example to continue a sequence from a previous system); issued numbers are never reused and the sequence has no gaps after it.
email_receiptsbooleanoptionalWhether the buyer is emailed a receipt (a tax receipt when the order was taxed) when payment confirms. Sent through the account's own connected email sender; nothing is sent when no sender is connected.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.create_store \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example",
    "slug": "example"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_create_store at https://app.chirply.io/api/mcp, same bearer token, same input.

Add variant

commerce.create_variantwrite

Add a purchasable size, color or option combination to an existing product, with optional SKU, price override and independent inventory.

Parameters

FieldTypeRequiredDescription
product_idstring (uuid)requiredParent product id.
namestringrequiredHuman-readable option combination such as Blue / Large.
skustringoptionalAccount-unique variant SKU.
option_valuesmap of string → stringoptionalOption labels and selected values, such as color=Blue and size=Large. Default: {}
price_amountintegeroptionalOptional price override in the smallest currency unit.
image_urlstring (uri)optionalVariant-specific public image URL.
track_inventorybooleanoptionalWhether this variant has independent stock. Default: true
inventory_quantityintegeroptionalStarting variant stock. Default: 0
inventory_policy"deny" | "continue"optionalWhether to stop at zero or allow backorders. Default: "deny"
positionintegeroptionalVariant display position. Default: 0
tax_rate_idstring (or null)optionalWhich of the store's tax rates (commerce.get_tax_settings) this item is charged at. Null or omitted uses the default — the store's default rate for a product, the product's rate for a variant. Ignored while the store's tax is off.
sale_price_amountinteger (or null)optionalA sale price in the smallest currency unit, lower than the regular price. While the sale window is open it is what shoppers pay on the storefront (shown with the regular price struck through); outside it the regular price applies automatically. One-time products only. Null removes the sale (and its dates). Funnel checkouts are not affected.
sale_starts_atstring (or null)optionalWhen the sale price starts applying (inclusive). Omit/null for "now". Either an ISO 8601 instant with an offset (2026-10-31T23:59:00+01:00), or a local date-time WITHOUT an offset (2026-10-31T23:59), which is read in the store's own timezone — DST included. Null clears it.
sale_ends_atstring (or null)optionalWhen the sale ends — the regular price applies from this instant on (exclusive end). Omit/null for no end. Either an ISO 8601 instant with an offset (2026-10-31T23:59:00+01:00), or a local date-time WITHOUT an offset (2026-10-31T23:59), which is read in the store's own timezone — DST included. Null clears it.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.create_variant \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_create_variant at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete collection

commerce.delete_collectionwriteconfirm

Permanently delete a storefront collection and its product arrangement. Products themselves and completed orders are not deleted.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredCollection id to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.delete_collection \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_delete_collection at https://app.chirply.io/api/mcp, same bearer token, same input.

Remove from store

commerce.detach_domainwriteconfirmadmin only

Stop serving the native store from its custom hostname. The store remains available at its built-in platform address and the domain remains connected to the account for reuse; no registrar or DNS ownership is deleted.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)requiredNative Commerce store whose custom hostname should be removed.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.detach_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_detach_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

Export orders CSV

commerce.export_ordersread

Export storefront orders as a CSV file for an accountant, built from the figures persisted at checkout so it reconciles to the receipts buyers hold. level 'orders' gives one row per order: order and invoice number, invoice/paid date (in the store's timezone), buyer, currency, tax mode, net, tax and gross totals, discount, delivery, amount charged and refunds. level 'lines' gives one row per order line with the tax rate name, percentage and treatment (standard, zero-rated, exempt or not taxed) and the line's net, tax and gross — summing it by rate gives the tax-return figures. Returns the CSV text. Read-only; the export contains buyer names and emails.

Parameters

FieldTypeRequiredDescription
level"orders" | "lines"optional'orders' for one row per order, 'lines' for one row per order line with its tax rate. Default: "orders"
fromstringoptionalFirst calendar day to include (YYYY-MM-DD), in the store's timezone. Omit for no lower bound.
tostringoptionalLast calendar day to include (YYYY-MM-DD, inclusive), in the store's timezone. Omit for no upper bound.
include_unpaidbooleanoptionalfalse (default): only orders that were paid (including later refunded ones), dated by payment. true: every storefront order including pending and failed checkouts, dated by creation. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.export_orders \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "level": "orders",
    "from": "example"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_export_orders at https://app.chirply.io/api/mcp, same bearer token, same input.

Mark fulfilled

commerce.fulfill_orderwriteconfirm

Mark a paid storefront order fulfilled and record optional carrier/tracking details. This is an outward operational claim that the seller has shipped or delivered the order.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredPaid storefront order id.
carrierstringoptionalShipping carrier or delivery provider.
tracking_numberstringoptionalCarrier tracking number.
tracking_urlstring (uri)optionalPublic tracking URL shared with the customer.
notestringoptionalInternal fulfillment note.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.fulfill_order \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_fulfill_order at https://app.chirply.io/api/mcp, same bearer token, same input.

Open store cart

commerce.get_cartread

Fetch one shopping cart on the public storefront by its token: every line with its product, chosen variant, quantity, unit price and whether it is still in stock, plus the server-calculated subtotal, discount, shipping, tax and total in the smallest currency unit. Prices are recalculated live from the catalogue, so this is the authority on what checkout will actually charge. Reads only — it holds no stock and charges nothing. Returns nothing if the cart has expired or was already checked out.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)optionalWhich storefront to shop. Optional — an account has one store, so this defaults to it.
cart_tokenstringrequiredThe cart's token, as returned by commerce.add_to_cart. A shopper's browser keeps this in a cookie; a machine caller has to carry it between calls. Carts expire, after which a new one must be started.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.get_cart \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "cart_token": "example"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_get_cart at https://app.chirply.io/api/mcp, same bearer token, same input.

Open store order

commerce.get_orderread

Fetch one storefront order with payment, customer, delivery and fulfillment fields, every line (product, SKU, variant, quantity, amounts, units refunded and restocked), the refunds recorded on it (amount, reason, who, when, Stripe refund id), whether and why it was cancelled, and the buyer's acceptance of the store's terms (when, which URL and version). Reads only.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredStore order id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.get_order \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_get_order at https://app.chirply.io/api/mcp, same bearer token, same input.

Open order receipt

commerce.get_order_by_tokenread

Fetch a storefront order using the order token from its confirmation link — the receipt page a buyer is sent to after checkout. Returns the order's number, payment status (whether Stripe has confirmed it yet), fulfilment status, buyer details, totals and every line item. Use this to poll whether a checkout you started has actually been paid. Reads only. Staff who have the order's internal id should use commerce.get_order instead.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)optionalWhich storefront to shop. Optional — an account has one store, so this defaults to it.
order_tokenstringrequiredThe order's public token — the last path segment of the confirmation URL, e.g. the '…/order/<this>' part. Returned by commerce.checkout as order_token.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.get_order_by_token \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "order_token": "example"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_get_order_by_token at https://app.chirply.io/api/mcp, same bearer token, same input.

Open product

commerce.get_productread

Fetch one catalog product with pricing, inventory, fulfillment and storefront fields.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredProduct id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.get_product \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_get_product at https://app.chirply.io/api/mcp, same bearer token, same input.

Open store

commerce.get_storeread

Fetch this account's storefront branding, publishing status, payment routing and public address.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.get_store \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool commerce_get_store at https://app.chirply.io/api/mcp, same bearer token, same input.

Open tax settings

commerce.get_tax_settingsread

Read the storefront's tax and VAT receipt settings: whether tax is on, whether prices are entered tax-inclusive or exclusive, the store's tax rates (id, name, percentage, and standard / zero-rated / exempt treatment) and default rate, the store timezone and default checkout country, the supplier details printed on receipts (legal and trading name, address, VAT number, company number, registered office), the invoice prefix and the number the next invoice will get, whether receipts are emailed, and the UK and Ireland rate presets available to add. Use the rate ids here for tax_rate_id on products and variants. Read-only; changes nothing.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.get_tax_settings \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool commerce_get_tax_settings at https://app.chirply.io/api/mcp, same bearer token, same input.

List open carts

commerce.list_cartsread

List persistent storefront carts, including identified buyers, discounts, totals and last activity, for abandoned-cart recovery and support.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"active" | "converted" | "abandoned" | "expired"optionalCart lifecycle state to list. Default: "active"
querystringoptionalSearch the buyer email or name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.list_carts \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool commerce_list_carts at https://app.chirply.io/api/mcp, same bearer token, same input.

List collections

commerce.list_collectionsread

List storefront collections used to merchandise related products into browsable groups.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
querystringoptionalSearch collection names and descriptions.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.list_collections \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool commerce_list_collections at https://app.chirply.io/api/mcp, same bearer token, same input.

List discounts

commerce.list_discountsread

List discount codes, eligibility, limits, active dates and redemption counts.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"draft" | "active" | "paused" | "expired"optionalOnly discounts in this status.
querystringoptionalSearch code or internal name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.list_discounts \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool commerce_list_discounts at https://app.chirply.io/api/mcp, same bearer token, same input.

List store orders

commerce.list_ordersread

List storefront orders with customer, payment totals and fulfillment state. Funnel-only orders are excluded.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"pending" | "paid" | "failed" | "refunded" | "partially_refunded"optionalOnly orders with this payment status.
fulfillment_status"unfulfilled" | "partial" | "fulfilled" | "on_hold" | "returned"optionalOnly orders with this fulfillment status.
querystringoptionalSearch customer name or email.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.list_orders \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool commerce_list_orders at https://app.chirply.io/api/mcp, same bearer token, same input.

List products

commerce.list_productsread

List products shared by storefronts and funnels, with price, visibility, SKU, product type and stock state.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"draft" | "active" | "archived"optionalOnly products with this storefront status.
product_type"physical" | "digital" | "service"optionalOnly physical, digital or service products.
querystringoptionalSearch product name, description, SKU or vendor.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.list_products \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool commerce_list_products at https://app.chirply.io/api/mcp, same bearer token, same input.

List subscriptions

commerce.list_subscriptionsread

List the recurring orders (subscriptions) sold through this account's storefront and funnels: buyer, amount, billing state (active, past_due after a failed renewal, canceled) and the Stripe subscription id on the seller's own Stripe account. Read-only.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
subscription_status"active" | "past_due" | "canceled"optionalOnly subscriptions in this billing state.
querystringoptionalSearch the buyer's name or email.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.list_subscriptions \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool commerce_list_subscriptions at https://app.chirply.io/api/mcp, same bearer token, same input.

List product variants

commerce.list_variantsread

List the sizes, colors or other purchasable variants for one product, including option values, price overrides and stock.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
product_idstring (uuid)requiredProduct whose variants to list.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.list_variants \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "product_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_list_variants at https://app.chirply.io/api/mcp, same bearer token, same input.

Pause discount

commerce.pause_discountwrite

Pause or reactivate a discount code. Pausing prevents it from reducing any new customer checkout immediately.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredDiscount id.
activebooleanoptionaltrue reactivates; false pauses it. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.pause_discount \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_pause_discount at https://app.chirply.io/api/mcp, same bearer token, same input.

Preview order event

commerce.preview_order_eventread

Show the exact payload an order event carries for one real order — order_paid, order_refunded or order_cancelled — as automations read it ({{order.…}} tokens) and as webhook subscribers receive it inside the signed envelope's `context`: order number, status, totals, the buyer's email and name, and every line with product, SKU, variant name and options, quantity, unit and line amounts and discount. Amounts are in the currency's smallest unit. Builds the payload only: nothing is sent, queued or changed.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe order to build the payload for — a store or funnel order.
event"order_paid" | "order_refunded" | "order_cancelled"optionalWhich event's payload to build. order_refunded previews with the order's most recent refund when it has one. Default: "order_paid"

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.preview_order_event \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_preview_order_event at https://app.chirply.io/api/mcp, same bearer token, same input.

Publish store

commerce.publish_storewriteconfirm

Publish the storefront to the open internet, or pause an already-public store. Publishing immediately exposes all active products and enables real checkout when payment mode is live.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredStore id.
publishedbooleanoptionaltrue publishes; false pauses the public storefront. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.publish_store \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_publish_store at https://app.chirply.io/api/mcp, same bearer token, same input.

Refund order

commerce.refund_orderwriteconfirmadmin only

Refund all or part of a paid store or funnel order on the seller's OWN Stripe account (or their agency's Connect account, whichever took the payment). This MOVES REAL MONEY back to the buyer's card and out of the seller's Stripe balance, and cannot be undone. Choose an exact amount, or specific lines and quantities (their value is the default amount), or neither to refund everything still refundable. Refuses anything above what is left to refund on the order and on the Stripe charge. The refund is recorded on the order (amount, reason, note, who, when, Stripe refund id), the order becomes partially_refunded or refunded, refunded units can be put back on tracked stock, and the order_refunded event fires — starting matching automations and notifying webhook subscribers. Idempotent: repeating the same request (or the same idempotency_key) returns the first refund instead of refunding twice.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe order to refund — a store order from commerce.list_orders, or a funnel order.
amountintegeroptionalExact amount to refund in the currency's smallest unit (pence/cents): 1500 = 15.00. Omit it — with no lines — to refund everything still refundable. With lines, it defaults to those units' value after discount.
linesobject[]optionalSpecific units being refunded, e.g. 2 of 5 tickets. Recorded on each line so it can't be refunded twice, and required for restocking.
lines[].item_idstring (uuid)requiredThe order line to refund, from the `lines` of commerce.get_order.
lines[].quantityintegerrequiredHow many units of that line are being refunded. Cannot exceed the units not yet refunded.
reason"requested_by_customer" | "duplicate" | "fraudulent" | "other"optionalWhy: requested_by_customer, duplicate, fraudulent or other. Passed to Stripe (except other) and recorded on the order. Default: "requested_by_customer"
notestringoptionalInternal note recorded with the refund and included in the order_refunded event. Not shown to the buyer by Stripe.
restockbooleanoptionalPut the refunded units back on tracked inventory so they can be sold again. Only applies to refunded lines whose product or variant tracks stock. Default: false
idempotency_keystringoptionalYour key for this refund. Retrying with the same key never refunds twice. Without one, an identical request (same amount, lines, reason and note) is treated as a retry — pass distinct keys to issue two genuinely separate, identical partial refunds.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.refund_order \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_refund_order at https://app.chirply.io/api/mcp, same bearer token, same input.

Save store checkout terms

commerce.set_checkout_termswrite

Turn the store's required terms checkbox on or off. When required, checkout shows a box linking to the seller's terms that the buyer must tick before paying; the server refuses any checkout without it (storefront, custom domain and commerce.checkout alike), and each order records that the terms were accepted, when, and which URL and version. Changing the URL or wording starts a new version from now on; past orders keep the version their buyer accepted. Takes effect on the live storefront immediately.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)optionalThe store to change. Optional — an account has one store, so this defaults to it.
requiredbooleanrequiredtrue makes buyers tick the box before paying; false removes the box.
urlstring (uri) (or null)optionalFull web address of the seller's terms (https://…). Required when `required` is true.
labelstring (or null)optionalThe checkbox wording, e.g. 'I agree to the ticket terms and refund policy'. Defaults to 'I agree to the terms and conditions'.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.set_checkout_terms \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "required": true
  }'
Test with your API key

Over MCP the same operation is the tool commerce_set_checkout_terms at https://app.chirply.io/api/mcp, same bearer token, same input.

Set collection products

commerce.set_collection_productswrite

Replace exactly which products are in a storefront collection, in display order (used for 'manual' sort). This is a FULL REPLACE: any product currently in the collection but left out of product_ids is removed from it — the product itself, its orders and its other collections are untouched. Pass an empty list to empty the collection.

Parameters

FieldTypeRequiredDescription
collection_idstring (uuid)requiredCollection to update, from commerce.list_collections.
product_idsarray of (string (uuid))requiredThe complete set of product ids that should be in this collection afterward, in display order. Every id must be one of this account's own products.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.set_collection_products \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "collection_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "product_ids": [
      "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
    ]
  }'
Test with your API key

Over MCP the same operation is the tool commerce_set_collection_products at https://app.chirply.io/api/mcp, same bearer token, same input.

Set up with connected Cloudflare

commerce.setup_domain_dnswriteconfirmadmin only

Create or repair the store hostname's CNAME in its connected Cloudflare account and recheck SSL. This writes a real public DNS record but does not purchase a domain or charge money.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)requiredNative Commerce store whose attached domain needs automatic DNS setup.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.setup_domain_dns \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_setup_domain_dns at https://app.chirply.io/api/mcp, same bearer token, same input.

Update cart quantity

commerce.update_cart_itemwrite

Change how many units of one line are in a storefront cart, or remove that line entirely by setting the quantity to 0. Totals are recalculated on the server. The change is refused when tracked stock would be exceeded. Nothing is charged and no stock is held.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)optionalWhich storefront to shop. Optional — an account has one store, so this defaults to it.
cart_tokenstringrequiredThe cart's token, as returned by commerce.add_to_cart. A shopper's browser keeps this in a cookie; a machine caller has to carry it between calls. Carts expire, after which a new one must be started.
line_idstring (uuid)requiredThe cart line to change, from the `lines[].id` values in commerce.get_cart. This is the line, not the product.
quantityintegerrequiredThe new total quantity for this line — it REPLACES the current one rather than adding to it. 0 removes the line from the cart.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.update_cart_item \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "cart_token": "example",
    "line_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "quantity": 1
  }'
Test with your API key

Over MCP the same operation is the tool commerce_update_cart_item at https://app.chirply.io/api/mcp, same bearer token, same input.

Save product

commerce.update_productwriteconfirm

Update a catalog product. This edits an item that may be ON SALE RIGHT NOW on a published storefront: a new price_amount, sale price/window or tax rate changes what real customers are charged from the moment it saves, and storefront_status can put the product on sale or pull it off in public immediately. Price changes affect future purchases only; completed order snapshots are never rewritten. A cart filled at an old price is re-priced at checkout and the shopper is shown the change.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredProduct id.
namestringoptionalCustomer-facing product name.
descriptionstring (or null)optionalProduct description, or null to clear.
image_urlstring (uri) (or null)optionalPrimary product image URL, or null to clear.
price_amountintegeroptionalNew future selling price in the smallest currency unit. Existing subscribers keep the price they signed up at; only new checkouts are affected.
compare_at_amountinteger (or null)optionalOriginal/strikethrough price, or null to clear.
kind"one_time" | "recurring"optionalSwitch between a one-time purchase and a recurring subscription. Changes FUTURE checkouts only; subscriptions already running keep billing as sold.
recurring_interval"day" | "week" | "month" | "year"optionalFor recurring products: the billing period unit for future checkouts.
recurring_interval_countintegeroptionalFor recurring products: intervals between charges for future checkouts — 3 with 'month' bills every 3 months.
grants_access_product_idstring (uuid) (or null)optionalMember access product automatically granted when a purchase of this product settles (see members.list_products), or null to detach it. Already-granted access is not revoked by changing this.
skustring (or null)optionalAccount-unique SKU, or null to clear.
vendorstring (or null)optionalBrand/vendor, or null to clear.
tagsstring[]optionalReplacement merchandising tag list.
requires_shippingbooleanoptionalWhether checkout collects delivery details.
track_inventorybooleanoptionalWhether successful sales decrement stock.
inventory_policy"deny" | "continue"optionalWhether to stop at zero or allow backorders.
low_stock_thresholdintegeroptionalLow-stock warning quantity.
storefront_status"draft" | "active" | "archived"optionalStorefront visibility state.
tax_rate_idstring (or null)optionalWhich of the store's tax rates (commerce.get_tax_settings) this item is charged at. Null or omitted uses the default — the store's default rate for a product, the product's rate for a variant. Ignored while the store's tax is off.
sale_price_amountinteger (or null)optionalA sale price in the smallest currency unit, lower than the regular price. While the sale window is open it is what shoppers pay on the storefront (shown with the regular price struck through); outside it the regular price applies automatically. One-time products only. Null removes the sale (and its dates). Funnel checkouts are not affected.
sale_starts_atstring (or null)optionalWhen the sale price starts applying (inclusive). Omit/null for "now". Either an ISO 8601 instant with an offset (2026-10-31T23:59:00+01:00), or a local date-time WITHOUT an offset (2026-10-31T23:59), which is read in the store's own timezone — DST included. Null clears it.
sale_ends_atstring (or null)optionalWhen the sale ends — the regular price applies from this instant on (exclusive end). Omit/null for no end. Either an ISO 8601 instant with an offset (2026-10-31T23:59:00+01:00), or a local date-time WITHOUT an offset (2026-10-31T23:59), which is read in the store's own timezone — DST included. Null clears it.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.update_product \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_update_product at https://app.chirply.io/api/mcp, same bearer token, same input.

Save storefront

commerce.update_storewriteconfirm

Update customer-facing storefront branding, merchandising copy, support details, payment routing, and the tax / VAT receipt / regional settings (the same fields commerce.update_tax_settings takes). Omitted fields are unchanged. Several fields move real money and are the reason this needs approval: changing stripe_account_id redirects where every future sale is PAID INTO; setting payment_mode to 'test' makes a live public storefront stop collecting real money entirely while still appearing to take orders; and the tax fields change what real customers are charged (tax added on top of tax-exclusive prices) and what their receipts say, from the next page load. Past orders are never re-taxed.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredStore id.
namestringoptionalCustomer-facing store name.
descriptionstring (or null)optionalStore description, or null to clear it.
logo_urlstring (uri) (or null)optionalPublic logo URL, or null to remove it.
hero_image_urlstring (uri) (or null)optionalPublic storefront hero image URL, or null to remove it.
hero_titlestring (or null)optionalPrimary storefront headline, or null for the default.
hero_copystring (or null)optionalSupporting storefront copy, or null for the default.
announcementstring (or null)optionalShort announcement bar message, or null to hide the bar.
accent_colorstringoptionalStore signature color as a six-digit hex value.
contact_emailstring (email) (or null)optionalCustomer support email address.
stripe_account_idstring (uuid) (or null)optionalConnected Stripe account that collects payments.
payment_mode"live" | "test"optionalWhether checkout moves real money or uses Stripe test mode.
seo_titlestring (or null)optionalMeta title used in search results and social share cards, or null to clear it.
seo_descriptionstring (or null)optionalMeta description used in search results and social share cards, or null to clear it.
seo_imagestring (uri) (or null)optionalSocial share preview image URL, or null to clear it.
tax_enabledbooleanoptionalTurn tax on or off for the storefront. When on, every cart and checkout calculates tax per line from the store's rates, and paid orders get a tax receipt with a sequential invoice number. Turning it on requires at least one rate and a default rate. Changes what real customers are charged from the next page load when prices are tax-exclusive.
prices_include_taxbooleanoptionaltrue: product prices are entered tax-inclusive (the shelf price is what the buyer pays and the tax is the part inside it — normal for UK/EU consumer pricing). false: prices are net and tax is added on top at checkout.
tax_labelstring (or null)optionalWhat the tax is called on the storefront and receipts, e.g. VAT, GST or Tax. Null uses the default for the store's currency.
tax_ratesobject[]optionalFULL REPLACEMENT of the store's tax rates. Rates left out are deleted; products pointing at a deleted rate fall back to the default rate. Past orders keep the rate they were charged at.
tax_rates[].idstringoptionalThe rate's id. When editing, keep an existing rate's id — products point at rates by id, so a changed id detaches them (they fall back to the default rate). Omit for a new rate and one is generated.
tax_rates[].namestringrequiredThe label printed on receipts and exports, e.g. 'UK Standard 20%'.
tax_rates[].rate_percentnumberoptionalThe percentage as typed, e.g. 20 or 13.5. Ignored — always 0 — when treatment is zero or exempt. Default: 0
tax_rates[].treatment"standard" | "zero" | "exempt"optionalstandard: the percentage applies. zero: zero-rated, charged at 0%. exempt: exempt, no tax. Zero-rated and exempt both charge nothing but are recorded separately on receipts and exports. Default: "standard"
tax_rates[].countrystring (or null)optionalTwo-letter country the rate belongs to (GB, IE…), used for grouping only.
add_preset_rates"GB" | "IE"optionalAppend a labelled preset list: GB adds UK Standard 20%, Reduced 5%, Zero-rated 0% and Exempt; IE adds Ireland Standard 23%, Reduced 13.5%, Second reduced 9%, Zero 0% and Exempt. Rates already present (same id) are skipped. Presets are starting points; which rate a product falls under is the seller's decision.
default_tax_rate_idstring (or null)optionalId of the rate applied to every product (and variant) that does not name its own. Must be one of the store's rates.
timezonestringoptionalIANA timezone of the store, e.g. Europe/London. Sale start and end times typed without an offset are read in this zone, and storefront and receipt dates are shown in it.
checkout_countrystring (or null)optionalTwo-letter country the checkout address form opens on, e.g. GB. Null keeps the US default.
supplierobjectoptionalSupplier details printed on receipts. Only the fields sent change; send null to clear one.
supplier.legal_namestring (or null)optionalThe supplier's legal name, printed at the top of every tax receipt.
supplier.trading_namestring (or null)optionalTrading name, when different from the legal name.
supplier.address_line1string (or null)optionalSupplier address, first line.
supplier.address_line2string (or null)optionalSupplier address, second line.
supplier.citystring (or null)optionalSupplier town or city.
supplier.regionstring (or null)optionalSupplier county, state or region.
supplier.postal_codestring (or null)optionalSupplier postcode.
supplier.countrystring (or null)optionalSupplier country, as it should be printed.
supplier.vat_numberstring (or null)optionalThe supplier's VAT (or other tax) registration number, printed on tax receipts.
supplier.company_numberstring (or null)optionalCompany registration number, printed when set.
supplier.registered_officestring (or null)optionalRegistered office address, printed when set.
invoice_prefixstringoptionalText before every invoice number, e.g. 'INV-' gives INV-00001. Changing it affects invoices issued from now on only.
next_invoice_numberintegeroptionalThe number the next invoice will get. It can only be moved UP (for example to continue a sequence from a previous system); issued numbers are never reused and the sequence has no gaps after it.
email_receiptsbooleanoptionalWhether the buyer is emailed a receipt (a tax receipt when the order was taxed) when payment confirms. Sent through the account's own connected email sender; nothing is sent when no sender is connected.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.update_store \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_update_store at https://app.chirply.io/api/mcp, same bearer token, same input.

Save tax settings

commerce.update_tax_settingswriteconfirm

Save the storefront's tax and VAT receipt settings — tax on/off, tax-inclusive or exclusive prices, the rate list and default rate, supplier details printed on receipts, invoice prefix and next number, receipt emails, store timezone and default checkout country. Omitted fields are unchanged. This changes what REAL customers are charged from the next page load (tax-exclusive prices get tax added at checkout) and what every new receipt says; paid orders keep the tax they were charged and their receipts never change. Presets are labelled starting points — which rate applies to which product is the seller's decision.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
tax_enabledbooleanoptionalTurn tax on or off for the storefront. When on, every cart and checkout calculates tax per line from the store's rates, and paid orders get a tax receipt with a sequential invoice number. Turning it on requires at least one rate and a default rate. Changes what real customers are charged from the next page load when prices are tax-exclusive.
prices_include_taxbooleanoptionaltrue: product prices are entered tax-inclusive (the shelf price is what the buyer pays and the tax is the part inside it — normal for UK/EU consumer pricing). false: prices are net and tax is added on top at checkout.
tax_labelstring (or null)optionalWhat the tax is called on the storefront and receipts, e.g. VAT, GST or Tax. Null uses the default for the store's currency.
tax_ratesobject[]optionalFULL REPLACEMENT of the store's tax rates. Rates left out are deleted; products pointing at a deleted rate fall back to the default rate. Past orders keep the rate they were charged at.
tax_rates[].idstringoptionalThe rate's id. When editing, keep an existing rate's id — products point at rates by id, so a changed id detaches them (they fall back to the default rate). Omit for a new rate and one is generated.
tax_rates[].namestringrequiredThe label printed on receipts and exports, e.g. 'UK Standard 20%'.
tax_rates[].rate_percentnumberoptionalThe percentage as typed, e.g. 20 or 13.5. Ignored — always 0 — when treatment is zero or exempt. Default: 0
tax_rates[].treatment"standard" | "zero" | "exempt"optionalstandard: the percentage applies. zero: zero-rated, charged at 0%. exempt: exempt, no tax. Zero-rated and exempt both charge nothing but are recorded separately on receipts and exports. Default: "standard"
tax_rates[].countrystring (or null)optionalTwo-letter country the rate belongs to (GB, IE…), used for grouping only.
add_preset_rates"GB" | "IE"optionalAppend a labelled preset list: GB adds UK Standard 20%, Reduced 5%, Zero-rated 0% and Exempt; IE adds Ireland Standard 23%, Reduced 13.5%, Second reduced 9%, Zero 0% and Exempt. Rates already present (same id) are skipped. Presets are starting points; which rate a product falls under is the seller's decision.
default_tax_rate_idstring (or null)optionalId of the rate applied to every product (and variant) that does not name its own. Must be one of the store's rates.
timezonestringoptionalIANA timezone of the store, e.g. Europe/London. Sale start and end times typed without an offset are read in this zone, and storefront and receipt dates are shown in it.
checkout_countrystring (or null)optionalTwo-letter country the checkout address form opens on, e.g. GB. Null keeps the US default.
supplierobjectoptionalSupplier details printed on receipts. Only the fields sent change; send null to clear one.
supplier.legal_namestring (or null)optionalThe supplier's legal name, printed at the top of every tax receipt.
supplier.trading_namestring (or null)optionalTrading name, when different from the legal name.
supplier.address_line1string (or null)optionalSupplier address, first line.
supplier.address_line2string (or null)optionalSupplier address, second line.
supplier.citystring (or null)optionalSupplier town or city.
supplier.regionstring (or null)optionalSupplier county, state or region.
supplier.postal_codestring (or null)optionalSupplier postcode.
supplier.countrystring (or null)optionalSupplier country, as it should be printed.
supplier.vat_numberstring (or null)optionalThe supplier's VAT (or other tax) registration number, printed on tax receipts.
supplier.company_numberstring (or null)optionalCompany registration number, printed when set.
supplier.registered_officestring (or null)optionalRegistered office address, printed when set.
invoice_prefixstringoptionalText before every invoice number, e.g. 'INV-' gives INV-00001. Changing it affects invoices issued from now on only.
next_invoice_numberintegeroptionalThe number the next invoice will get. It can only be moved UP (for example to continue a sequence from a previous system); issued numbers are never reused and the sequence has no gaps after it.
email_receiptsbooleanoptionalWhether the buyer is emailed a receipt (a tax receipt when the order was taxed) when payment confirms. Sent through the account's own connected email sender; nothing is sent when no sender is connected.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.update_tax_settings \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "tax_enabled": true,
    "prices_include_tax": true
  }'
Test with your API key

Over MCP the same operation is the tool commerce_update_tax_settings at https://app.chirply.io/api/mcp, same bearer token, same input.

Save variant

commerce.update_variantwriteconfirm

Update one purchasable option (a ticket tier, a size) of a product: its name, SKU, own price, tax rate, or a scheduled sale price with start and end times. This edits an item that may be ON SALE RIGHT NOW: a new price, sale or tax rate is what real customers are charged on the storefront from the moment it saves. Past orders are never changed. Omitted fields are unchanged.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredVariant id, from commerce.list_variants.
namestringoptionalHuman-readable option name such as Early Bird or Blue / Large.
skustring (or null)optionalAccount-unique variant SKU, or null to clear.
price_amountinteger (or null)optionalThe variant's own regular price in the smallest currency unit, or null to inherit the product's price (and with it the product's sale).
is_activebooleanoptionalfalse hides this option from the storefront without deleting it.
tax_rate_idstring (or null)optionalWhich of the store's tax rates (commerce.get_tax_settings) this item is charged at. Null or omitted uses the default — the store's default rate for a product, the product's rate for a variant. Ignored while the store's tax is off.
sale_price_amountinteger (or null)optionalA sale price in the smallest currency unit, lower than the regular price. While the sale window is open it is what shoppers pay on the storefront (shown with the regular price struck through); outside it the regular price applies automatically. One-time products only. Null removes the sale (and its dates). Funnel checkouts are not affected.
sale_starts_atstring (or null)optionalWhen the sale price starts applying (inclusive). Omit/null for "now". Either an ISO 8601 instant with an offset (2026-10-31T23:59:00+01:00), or a local date-time WITHOUT an offset (2026-10-31T23:59), which is read in the store's own timezone — DST included. Null clears it.
sale_ends_atstring (or null)optionalWhen the sale ends — the regular price applies from this instant on (exclusive end). Omit/null for no end. Either an ISO 8601 instant with an offset (2026-10-31T23:59:00+01:00), or a local date-time WITHOUT an offset (2026-10-31T23:59), which is read in the store's own timezone — DST included. Null clears it.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.update_variant \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_update_variant at https://app.chirply.io/api/mcp, same bearer token, same input.

Check again

commerce.verify_domainwriteadmin only

Recheck the store domain's Cloudflare hostname and SSL status, then save the latest verification state. This does not change DNS or spend money.

Parameters

FieldTypeRequiredDescription
store_idstring (uuid)requiredNative Commerce store whose attached domain should be rechecked.

Example

curl -X POST https://app.chirply.io/api/v1/actions/commerce.verify_domain \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool commerce_verify_domain at https://app.chirply.io/api/mcp, same bearer token, same input.

The machine-readable version of this page is GET https://app.chirply.io/api/v1/actions?domain=commerce — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.