@usethrottle/mcp 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"generatedAt":"2026-10-03T20:49:15.498Z","operations":[{"method":"GET","path":"/health","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/ready","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/internal/sentry-smoke","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/unsubscribe","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/unsubscribe/apply","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/organizations","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List organizations"},{"method":"POST","path":"/api/v1/organizations","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string"},{"name":"settings","required":false,"type":"object"}],"description":"Create an organization"},{"method":"GET","path":"/api/v1/organizations/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get organization by ID"},{"method":"PATCH","path":"/api/v1/organizations/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Update an organization"},{"method":"GET","path":"/api/v1/stores","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List all stores for the organization"},{"method":"POST","path":"/api/v1/stores","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string","description":"URL-safe identifier, unique per organization"},{"name":"currency","required":false,"type":"string","description":"ISO 4217 currency code"},{"name":"settings","required":false,"type":"object"}],"description":"Create a new store under the organization"},{"method":"GET","path":"/api/v1/stores/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a store by ID"},{"method":"PATCH","path":"/api/v1/stores/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"currency","required":false,"type":"string","description":"ISO 4217 currency code"},{"name":"settings","required":false,"type":"object"},{"name":"isActive","required":false,"type":"boolean","description":"Deactivate a store without deleting it"}],"description":"Update a store (name, currency, settings, active status)"},{"method":"GET","path":"/api/v1/customers","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"applicationId","required":false,"type":"string"},{"name":"email","required":false,"type":"string"},{"name":"identity","required":false,"type":"string","enum":["linked","unlinked"]},{"name":"q","required":false,"type":"string","description":"Search email, name, phone, external ids, or metadata."},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List customers with cursor pagination"},{"method":"POST","path":"/api/v1/customers","pathParams":[],"queryParams":[],"bodyFields":[{"name":"applicationId","required":false,"type":"string"},{"name":"email","required":true,"type":"string"},{"name":"externalId","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"acceptsMarketing","required":false,"type":"boolean"},{"name":"netN","required":false,"type":"integer"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Create a new customer"},{"method":"GET","path":"/api/v1/customers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a customer by ID"},{"method":"PATCH","path":"/api/v1/customers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"email","required":false,"type":"string"},{"name":"externalId","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"acceptsMarketing","required":false,"type":"boolean"},{"name":"netN","required":false,"type":"integer"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a customer"},{"method":"DELETE","path":"/api/v1/customers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Delete a customer"},{"method":"GET","path":"/api/v1/customers/by-external/{externalId}","pathParams":["externalId"],"queryParams":[],"bodyFields":null,"description":"Look up a customer by the merchant's own externalId (set when the customer was created). Useful for merchant backends that key their user table off their own IDs and don't store the throttle customerId."},{"method":"POST","path":"/api/v1/customers/{id}/anonymize","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Anonymize a customer (soft GDPR delete): tombstone the customer + address PII in place while keeping order/payment/subscription history. Irreversible."},{"method":"GET","path":"/api/v1/customers/{id}/addresses","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List addresses for a customer"},{"method":"POST","path":"/api/v1/customers/{id}/addresses","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"label","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string","description":"Optional. Business name for B2B addresses."},{"name":"addressLine1","required":true,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":true,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":true,"type":"string","description":"ISO 3166-1 alpha-2"},{"name":"phone","required":false,"type":"string"},{"name":"isDefault","required":false,"type":"boolean"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Add an address to a customer"},{"method":"PATCH","path":"/api/v1/customers/{customerId}/addresses/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":[{"name":"label","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string","description":"Optional. Business name for B2B addresses."},{"name":"addressLine1","required":false,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":false,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":false,"type":"string","description":"ISO 3166-1 alpha-2"},{"name":"phone","required":false,"type":"string"},{"name":"isDefault","required":false,"type":"boolean"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a customer address"},{"method":"DELETE","path":"/api/v1/customers/{customerId}/addresses/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Delete a customer address"},{"method":"GET","path":"/api/v1/customers/{id}/payment-methods","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List payment methods for a customer"},{"method":"POST","path":"/api/v1/customers/{id}/payment-methods","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"processor","required":true,"type":"string"},{"name":"processorToken","required":true,"type":"string"},{"name":"methodType","required":true,"type":"string","enum":["card","bank_account","wallet"]},{"name":"cardBrand","required":false,"type":"string"},{"name":"cardLastFour","required":false,"type":"string"},{"name":"cardExpMonth","required":false,"type":"integer"},{"name":"cardExpYear","required":false,"type":"integer"},{"name":"isDefault","required":false,"type":"boolean"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Add a payment method to a customer"},{"method":"GET","path":"/api/v1/customers/{customerId}/payment-methods/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Get a customer payment method"},{"method":"PATCH","path":"/api/v1/customers/{customerId}/payment-methods/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":[{"name":"isDefault","required":false,"type":"boolean"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a customer payment method"},{"method":"DELETE","path":"/api/v1/customers/{customerId}/payment-methods/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Delete a customer payment method"},{"method":"POST","path":"/api/v1/customers/{customerId}/payment-methods/{id}/pause","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Pause a customer payment method"},{"method":"POST","path":"/api/v1/customers/{customerId}/payment-methods/{id}/resume","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Resume a customer payment method"},{"method":"POST","path":"/api/v1/payment-methods/client-token","pathParams":[],"queryParams":[],"bodyFields":[{"name":"customerId","required":true,"type":"string"},{"name":"subscriptionId","required":false,"type":"string"}],"summary":"Mint a customer-scoped client token for browser payment-method management"},{"method":"GET","path":"/api/v1/me/payment-methods","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List the authenticated customer's saved payment methods"},{"method":"PATCH","path":"/api/v1/me/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"isDefault","required":true,"type":"boolean","enum":["true"]}],"summary":"Set a saved payment method as default"},{"method":"DELETE","path":"/api/v1/me/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Remove a saved payment method"},{"method":"POST","path":"/api/v1/me/payment-methods/embed-token","pathParams":[],"queryParams":[],"bodyFields":[{"name":"currency","required":false,"type":"string"}],"summary":"Mint a Gr4vy add-only vault embed token scoped to the authenticated customer"},{"method":"POST","path":"/api/v1/me/payment-methods/confirm","pathParams":[],"queryParams":[],"bodyFields":[{"name":"transactionId","required":true,"type":"string"}],"summary":"Record a card vaulted via the add-card embed"},{"method":"GET","path":"/api/v1/me/subscriptions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"One of the authenticated customer's subscriptions, with the card that renews it"},{"method":"POST","path":"/api/v1/me/subscriptions/{id}/retry-charge","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Charge a past-due subscription now, against its default card"},{"method":"POST","path":"/api/v1/carts","pathParams":[],"queryParams":[],"bodyFields":[{"name":"applicationId","required":false,"type":"string"},{"name":"customerId","required":false,"type":"string"},{"name":"customerEmail","required":false,"type":"string"},{"name":"currency","required":false,"type":"string"},{"name":"netN","required":false,"type":"integer"},{"name":"buyerVatNumber","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Create a new cart"},{"method":"GET","path":"/api/v1/carts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a cart by ID (includes line items)"},{"method":"PATCH","path":"/api/v1/carts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"customerId","required":false,"type":"string"},{"name":"customerEmail","required":false,"type":"string"},{"name":"billingAddress","required":false,"type":"object"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"notes","required":false,"type":"string"},{"name":"netN","required":false,"type":"integer"},{"name":"buyerVatNumber","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a cart"},{"method":"POST","path":"/api/v1/carts/{id}/items","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"type","required":false,"type":"string","enum":["product","subscription","service","ticket","donation","custom"]},{"name":"referenceId","required":false,"type":"string"},{"name":"name","required":true,"type":"string"},{"name":"description","required":false,"type":"string"},{"name":"unitPrice","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"quantity","required":false,"type":"integer"},{"name":"taxAmount","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"discountAmount","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"imageUrl","required":false,"type":"string","description":"Product image. Accepts an absolute http(s) URL or a relative path (e.g. \"/images/x.png\"); relative paths are resolved against the application storefront base URL (PUT /v1/embed-config { storefrontBaseUrl }, falling back to the first allowedOrigin)."},{"name":"requiresShipping","required":false,"type":"boolean","description":"Whether this item is physically shippable. For external/ad-hoc catalogs with no Throttle product behind the item. Omit to infer from `type` (everything except `service` ships); set explicitly to force-include or force-exclude the item from `calculated` shipping."},{"name":"deliveryMethod","required":false,"type":"string","description":"What this item needs before it counts as delivered. Omit to resolve from `type` and `metadata`. `digital` and `access_grant` are delivered automatically on payment capture; `none` means there is nothing to deliver.","enum":["shipment","digital","access_grant","service","in_person","custom","none"]},{"name":"recurring","required":false,"type":"object","description":"Makes this line a subscription (type is forced to `subscription`). One subscription is created per line when the checkout completes; at most 10 per cart. Send `interval`, or `intervalUnit` + `intervalCount` (1 hour to 1 year). `totalPayments` (2-60) makes it an installment plan; `trialDays` (0-365) adds a free trial and cannot be combined with `totalPayments`. A trial line is stored with `unitPric"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Add a line item to a cart"},{"method":"PATCH","path":"/api/v1/carts/{cartId}/items/{id}","pathParams":["cartId","id"],"queryParams":[],"bodyFields":[{"name":"quantity","required":false,"type":"integer"},{"name":"unitPrice","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"taxAmount","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"discountAmount","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a line item"},{"method":"DELETE","path":"/api/v1/carts/{cartId}/items/{id}","pathParams":["cartId","id"],"queryParams":[],"bodyFields":null,"description":"Remove a line item from a cart"},{"method":"POST","path":"/api/v1/carts/{id}/checkout","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Convert the cart to a draft order. Legacy alias for /finalize — same handler, identical semantics. New integrations should call /finalize instead."},{"method":"POST","path":"/api/v1/carts/{id}/finalize","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Finalize a cart by converting it to a draft order (status=draft). To collect payment, mint a checkout session against the resulting order afterwards."},{"method":"POST","path":"/api/v1/carts/{id}/merge","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/carts/{id}/apply-discount","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"code","required":true,"type":"string"}],"description":"Apply a discount code to a cart"},{"method":"DELETE","path":"/api/v1/carts/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Remove discount code from a cart"},{"method":"POST","path":"/api/v1/carts/{id}/shipping","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"methodId","required":true,"type":"string"},{"name":"displayName","required":true,"type":"string"},{"name":"rateAmount","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"currency","required":false,"type":"string"},{"name":"carrier","required":false,"type":"string"},{"name":"serviceCode","required":false,"type":"string"},{"name":"estimatedDeliveryDays","required":false,"type":"integer"}],"description":"Select a shipping method for a cart"},{"method":"DELETE","path":"/api/v1/carts/{id}/shipping","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Clear the selected shipping method from a cart"},{"method":"PUT","path":"/api/v1/carts/{id}/tax-lines","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"lines","required":true,"type":"object[]"}],"description":"Replace all tax lines on a cart"},{"method":"DELETE","path":"/api/v1/carts/{id}/tax-lines","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Clear all tax lines from a cart"},{"method":"GET","path":"/api/v1/carts/{id}/events","pathParams":["id"],"queryParams":[{"name":"sinceSequence","required":false,"type":"integer"},{"name":"limit","required":false,"type":"integer"}],"bodyFields":null,"description":"List audit events for a cart"},{"method":"GET","path":"/api/v1/abandoned-carts","pathParams":[],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"cursor","required":false,"type":"string"}],"bodyFields":null,"summary":"List abandoned carts (most-recently abandoned first)."},{"method":"GET","path":"/api/v1/abandoned-carts/summary","pathParams":[],"queryParams":[{"name":"sinceDays","required":false,"type":"integer"}],"bodyFields":null,"summary":"Abandoned-cart summary metrics over a trailing window."},{"method":"POST","path":"/api/v1/cart-sessions","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/cart-sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/cart-sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/cart-sessions/{id}/summary","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/items","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/cart-sessions/{id}/items/{itemId}","pathParams":["id","itemId"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/cart-sessions/{id}/items/{itemId}","pathParams":["id","itemId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/shipping","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/cart-sessions/{id}/shipping","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/cart-sessions/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/checkout-session","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/config","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/quote-tokens","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/quote-tokens","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/shipping-tax/quote-tokens/{tokenId}","pathParams":["tokenId"],"queryParams":[],"bodyFields":null},{"method":"PUT","path":"/api/v1/shipping-tax/config/draft","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/config/publish","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/quotes","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/carts/{cartId}/calculate","pathParams":["cartId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/external-snapshots","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/shipping-providers/available","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/tax-providers/available","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/shipping-providers","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/shipping-providers","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/capabilities","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/tax-providers","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers/companies","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers/referral-click","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/shipping-providers/{id}/verify","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers/{id}/verify","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/shipping-providers/{id}/primary","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers/{id}/primary","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/shipping-tax/shipping-providers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/shipping-tax/tax-providers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/shipping-tax/tax-providers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/documents","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/entity-use-codes","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/tax-codes","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/locations","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/validate-address","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/documents/customs","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/documents/{id}/retry","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/tax-classifications","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/tax-classifications","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/tax-classifications/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/tax-classifications/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/ecm/test-connection","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/customers/{id}/exemption-certificates","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/customers/{id}/exemption-certificates/{certificateId}/download","pathParams":["id","certificateId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/customers/{id}/exemption-certificates/request","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/customers/{id}/exemption-certificates/{certificateId}","pathParams":["id","certificateId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/ecm/exempt-reasons","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/ecm/exposure-zones","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/provider-calls","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/provider-calls/stats","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/provider-calls/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/orders","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","enum":["draft","pending","processing","partially_fulfilled","fulfilled","cancelled","closed"]},{"name":"paymentStatus","required":false,"type":"string","enum":["pending","authorized","captured","partially_paid","partially_refunded","refunded","failed","voided","processing","disputed","expired"]},{"name":"type","required":false,"type":"string","enum":["one_time","recurring","mixed"]},{"name":"delivery","required":false,"type":"string","description":"Where the goods are. Derived from shipment and return records, not an order column: `not_shipped` = nothing has left yet on an order that still owes goods (status `processing` or `partially_fulfilled`, no returns), `in_transit` = something shipped and something has not arrived, `delivered` = every shipment arrived, `returned` = any items came back (a partial return included).","enum":["not_shipped","in_transit","delivered","returned"]},{"name":"source","required":false,"type":"string","enum":["web","mobile","pos","api","subscription_engine"]},{"name":"q","required":false,"type":"string","description":"Search order id, number, source, status, or metadata."},{"name":"customerId","required":false,"type":"string"},{"name":"subscriptionId","required":false,"type":"string","description":"Return only the orders linked to this subscription: through one of their lines (every subscription a checkout creates), `subscriptionId`, or the legacy `metadata.subscription_id` pointer. Covers the signup order, renewals and plan-change charges."},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List orders with cursor pagination"},{"method":"POST","path":"/api/v1/orders","pathParams":[],"queryParams":[],"bodyFields":[{"name":"customerId","required":false,"type":"string"},{"name":"currency","required":false,"type":"string"},{"name":"source","required":false,"type":"string","enum":["web","mobile","pos","api"]},{"name":"billingAddress","required":false,"type":"object"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"notes","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"},{"name":"lineItems","required":false,"type":"object[]"}],"description":"Create a new order (draft)"},{"method":"GET","path":"/api/v1/orders/export.csv","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","enum":["draft","pending","processing","partially_fulfilled","fulfilled","cancelled","closed"]},{"name":"paymentStatus","required":false,"type":"string","enum":["pending","authorized","captured","partially_paid","partially_refunded","refunded","failed","voided","processing","disputed","expired"]},{"name":"type","required":false,"type":"string","enum":["one_time","recurring","mixed"]},{"name":"delivery","required":false,"type":"string","description":"Where the goods are. Derived from shipment and return records, not an order column: `not_shipped` = nothing has left yet on an order that still owes goods (status `processing` or `partially_fulfilled`, no returns), `in_transit` = something shipped and something has not arrived, `delivered` = every shipment arrived, `returned` = any items came back (a partial return included).","enum":["not_shipped","in_transit","delivered","returned"]},{"name":"source","required":false,"type":"string","enum":["web","mobile","pos","api","subscription_engine"]},{"name":"q","required":false,"type":"string","description":"Search order id, number, source, status, or metadata."},{"name":"customerId","required":false,"type":"string"},{"name":"subscriptionId","required":false,"type":"string","description":"Return only the orders linked to this subscription: through one of their lines (every subscription a checkout creates), `subscriptionId`, or the legacy `metadata.subscription_id` pointer. Covers the signup order, renewals and plan-change charges."},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"summary":"Export orders (respecting list filters) as a CSV attachment. Capped at 10,000 rows."},{"method":"GET","path":"/api/v1/orders/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get an order by ID (includes line items, plus `capturedAmount` and `refundedAmount`)"},{"method":"PATCH","path":"/api/v1/orders/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"billingAddress","required":false,"type":"object"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"notes","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update order fields (addresses, notes, metadata)"},{"method":"POST","path":"/api/v1/orders/{id}/checkout","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Initiate checkout (draft -> pending)"},{"method":"POST","path":"/api/v1/orders/{id}/authorize","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentId","required":true,"type":"string"}],"description":"Mark payment as authorized (pending -> processing)"},{"method":"POST","path":"/api/v1/orders/{id}/capture","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentId","required":true,"type":"string"}],"description":"Mark payment as captured (pending -> processing)"},{"method":"POST","path":"/api/v1/orders/{id}/cancel","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":false,"type":"string"},{"name":"refundCapturedPayments","required":false,"type":"boolean"}],"description":"Cancel an order. Authorized payments are always voided; captured payments are refunded when refundCapturedPayments is true."},{"method":"POST","path":"/api/v1/orders/{id}/status","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"status","required":true,"type":"string","enum":["draft","pending","processing","partially_fulfilled","fulfilled","cancelled","closed"]},{"name":"reason","required":false,"type":"string"}],"description":"Move an order to any lifecycle status. Both directions are allowed — this is the merchant override, not a state-machine step. Side effects already applied are never rewound. Moving to `cancelled` additionally requires the `order_cancellations:write` scope and voids the order's live authorizations, exactly as `POST /orders/{id}/cancel` does; captured payments are left alone."},{"method":"POST","path":"/api/v1/orders/{id}/comp","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string"}],"description":"Write off the order's remaining balance. Money already captured stays captured; the buyer is never charged and no processor is contacted. `compAmount` is set to the balance outstanding; `total` is NOT reduced, because the order is still a sale of that size — the comp is a credit recorded against it. What the buyer owes is `total - compAmount`, so `paymentStatus` settles at `captured` and `displayStatus` reads \"… · Comped\"."},{"method":"POST","path":"/api/v1/orders/{id}/comp/reverse","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Undo a comp. The order owes what it owed again: `compAmount` returns to 0 (`total` never moved) and `paymentStatus` falls back out of `captured` on its own. Side effects of the comp are NOT rewound: an authorization voided at the processor cannot be un-voided, so collecting the restored balance needs a new payment, and a tax document voided or returned at the provider needs a manual re-file (`POST /v1/tax-documents/{id}/retry`)."},{"method":"POST","path":"/api/v1/orders/{id}/hold","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string"}],"description":"Freeze an order operationally. A hold is a flag, not a stage: `status`, `paymentStatus` and `displayStatus` are unchanged, and nothing about money or delivery moves. Holdable while the order is still live (`pending`, `processing`, `partially_fulfilled`, `fulfilled`); a draft, cancelled or closed order answers 422 `order_not_holdable`. Re-holding with the same reason is a no-op and does not restart `heldAt`; a new reason overwrites it. `heldBy` comes from the caller's credentials and cannot be supplied."},{"method":"POST","path":"/api/v1/orders/{id}/hold/release","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Lift a hold. All four hold columns are cleared together. An order that is not held answers 422 `order_not_on_hold`."},{"method":"GET","path":"/api/v1/orders/{id}/status-history","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Append-only record of every status change on this order, oldest first."},{"method":"GET","path":"/api/v1/orders/{id}/timeline","pathParams":["id"],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"cursor","required":false,"type":"string"}],"bodyFields":null,"description":"Everything that happened to this order, newest first: status changes, payment attempts (including declines, which write no status-history row), and fulfillment events. One row shape for every source."},{"method":"POST","path":"/api/v1/orders/{id}/close","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Close a fulfilled order (archive it from active views)"},{"method":"GET","path":"/api/v1/orders/{id}/payments","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List payments for an order"},{"method":"POST","path":"/api/v1/orders/{id}/payments","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"processor","required":false,"type":"string"},{"name":"amount","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"currency","required":false,"type":"string"},{"name":"method","required":false,"type":"string","enum":["card","bank_transfer","wallet","cash","cheque","external","manual","net30"]},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Create a payment for an order"},{"method":"POST","path":"/api/v1/orders/{id}/payments/record","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"amount","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"currency","required":false,"type":"string"},{"name":"method","required":true,"type":"string","enum":["cash","bank_transfer","cheque","external"]},{"name":"receivedAt","required":false,"type":"string"},{"name":"reference","required":false,"type":"string"},{"name":"note","required":false,"type":"string"}],"description":"Record money that arrived outside Throttle — cash, a bank transfer to the merchant's own account, a cheque. The payment is created already captured, so the order advances exactly as a processor capture would. Excluded from billable GMV."},{"method":"GET","path":"/api/v1/orders/{id}/payments/{paymentId}","pathParams":["id","paymentId"],"queryParams":[],"bodyFields":null,"description":"Get a specific payment for an order"},{"method":"GET","path":"/api/v1/payments/{id}/transactions","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List transactions for a payment"},{"method":"GET","path":"/api/v1/payments","pathParams":[],"queryParams":[{"name":"method","required":false,"type":"string"},{"name":"status","required":false},{"name":"limit","required":false,"type":"string"},{"name":"cursor","required":false,"type":"string"},{"name":"aging","required":false,"type":"string","enum":["0_30","31_60","61_90","90_plus"]},{"name":"order_id","required":false,"type":"string"},{"name":"due_from","required":false,"type":"string"},{"name":"due_to","required":false,"type":"string"},{"name":"amount_min","required":false,"type":"string"},{"name":"amount_max","required":false,"type":"string"}],"bodyFields":null,"summary":"List payments for the calling merchant."},{"method":"GET","path":"/api/v1/payments/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get a payment by id."},{"method":"POST","path":"/api/v1/orders/{id}/refund","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"amount","required":false,"type":"integer","description":"Partial refund amount (defaults to everything still refundable on the order)"},{"name":"reason","required":false,"type":"string"}],"description":"Refund an order. Spread across its captured payments, newest capture first, when the order was paid in instalments."},{"method":"POST","path":"/api/v1/payments/{id}/authorize","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Authorize a payment (pending -> authorized)"},{"method":"POST","path":"/api/v1/payments/{id}/capture","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"amount","required":false,"type":"integer","description":"Partial capture amount (defaults to full amount)"}],"description":"Capture a payment (authorized -> captured)"},{"method":"POST","path":"/api/v1/payments/{id}/void","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Void an authorized payment"},{"method":"POST","path":"/api/v1/payments/{id}/mark-failed","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string","description":"Why the money never arrived. Stored on the payment and shown in the timeline."}],"description":"Record that a payment failed with no processor involved — a cheque that bounced, a wire that never arrived, a buyer who abandoned a 3DS challenge. Only `pending` and `processing` payments can be marked failed: captured money must be refunded, and a live authorization must be voided so the hold is released."},{"method":"POST","path":"/api/v1/payments/{id}/refund","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"amount","required":false,"type":"integer","description":"Partial refund amount (defaults to full amount)"},{"name":"reason","required":false,"type":"string"}],"description":"Refund a captured payment (full or partial)"},{"method":"POST","path":"/api/v1/payments/{id}/invoice/resend","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Resend the Net-N invoice email to the customer."},{"method":"GET","path":"/api/v1/payments/{id}/invoice-pdf","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get a signed download URL for a Net30 invoice PDF."},{"method":"GET","path":"/api/v1/invoices","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Pagination cursor"},{"name":"limit","required":false,"type":"integer"},{"name":"sort","required":false,"type":"string","enum":["asc","desc"]},{"name":"status","required":false,"type":"string","enum":["paid","open","refunded","partially_refunded","void"]},{"name":"type","required":false,"type":"string","enum":["order","net30","subscription"]},{"name":"sourceId","required":false,"type":"string","description":"Filter to invoices for a specific source: the payment id for order/net30 invoices, or the subscription invoice id for subscription invoices."}],"bodyFields":null,"summary":"List invoices","description":"List all invoices for the application across all customers and payment source types. Requires invoices:read scope."},{"method":"GET","path":"/api/v1/customers/{customerId}/invoices","pathParams":["customerId"],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Pagination cursor"},{"name":"limit","required":false,"type":"integer"},{"name":"sort","required":false,"type":"string","enum":["asc","desc"]},{"name":"status","required":false,"type":"string","enum":["paid","open","refunded","partially_refunded","void"]},{"name":"type","required":false,"type":"string","enum":["order","net30","subscription"]},{"name":"sourceId","required":false,"type":"string","description":"Filter to invoices for a specific source: the payment id for order/net30 invoices, or the subscription invoice id for subscription invoices."}],"bodyFields":null,"summary":"List invoices for a customer","description":"List all invoices scoped to a specific customer. Requires invoices:read scope."},{"method":"GET","path":"/api/v1/invoices/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get invoice","description":"Fetch a single invoice by ID. Requires invoices:read scope."},{"method":"GET","path":"/api/v1/invoices/{id}/download","pathParams":["id"],"queryParams":[{"name":"format","required":false,"type":"string","enum":["json"]}],"bodyFields":null,"summary":"Download invoice PDF","description":"Returns a 302 redirect to a short-lived signed S3 URL for the invoice PDF. Pass ?format=json to receive the URL as JSON instead. Requires invoices:read scope."},{"method":"GET","path":"/api/v1/orders/{orderId}/fulfillments","pathParams":["orderId"],"queryParams":[],"bodyFields":null,"description":"List fulfillments for an order"},{"method":"POST","path":"/api/v1/orders/{orderId}/fulfillments","pathParams":["orderId"],"queryParams":[],"bodyFields":[{"name":"type","required":true,"type":"string","enum":["shipment","digital","access_grant","service","in_person","custom"]},{"name":"lineItemIds","required":true,"type":"object[]"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"},{"name":"shipment","required":false,"type":"object","description":"Shipment detail to seed at creation; only accepted when type is 'shipment'. A trackingNumber here fires fulfillment.shipment.shipped right after fulfillment.created, exactly as the first PATCH .../shipment that sets one would. Omit it to record tracking later."}],"description":"Create a fulfillment for an order"},{"method":"GET","path":"/api/v1/orders/{orderId}/fulfillments/{id}","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Get a fulfillment by ID (includes type-specific details)"},{"method":"POST","path":"/api/v1/orders/{orderId}/fulfillments/{id}/processing","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Mark fulfillment as processing"},{"method":"POST","path":"/api/v1/orders/{orderId}/fulfillments/{id}/complete","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Mark fulfillment as completed"},{"method":"POST","path":"/api/v1/orders/{orderId}/fulfillments/{id}/cancel","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Cancel a fulfillment"},{"method":"POST","path":"/api/v1/fulfillments/{id}/delivered","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"deliveredAt","required":false,"type":"string","description":"When the parcel arrived. Defaults to now."}],"description":"Record that a shipment arrived. Writes `shipments.actualDelivery`, which surfaces as the order's `Delivered` label and fires `fulfillment.shipment.delivered`. Refuses with `422 fulfillment_not_shipped` before carrier handoff and `409 already_delivered` on a second call."},{"method":"PATCH","path":"/api/v1/orders/{orderId}/fulfillments/{id}/shipment","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Update shipment details for a fulfillment"},{"method":"PATCH","path":"/api/v1/orders/{orderId}/fulfillments/{id}/digital","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Update digital delivery details"},{"method":"PATCH","path":"/api/v1/orders/{orderId}/fulfillments/{id}/access","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Update access grant details"},{"method":"PATCH","path":"/api/v1/orders/{orderId}/fulfillments/{id}/service","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Update service delivery details"},{"method":"GET","path":"/api/v1/subscriptions","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"customerId","required":false,"type":"string"},{"name":"externalCustomerId","required":false,"type":"string","description":"Filter by the merchant's own customer ID (the value passed as externalId on customer creation). Server resolves to the throttle customerId before filtering. Mutually exclusive with customerId."},{"name":"status","required":false,"type":"string","enum":["active","paused","cancelled","past_due","trialing","unpaid","completed"]},{"name":"interval","required":false,"type":"string","description":"A named interval, or \"custom\" when intervalUnit/intervalCount describe any other cadence","enum":["weekly","biweekly","monthly","quarterly","yearly","custom"]},{"name":"installment","required":false,"type":"boolean","description":"true: only installment plans; false: only ongoing subscriptions"},{"name":"q","required":false,"type":"string","description":"Search subscription id, customer id, plan reference, plan name, status, interval, and metadata."},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List subscriptions with cursor pagination"},{"method":"POST","path":"/api/v1/subscriptions","pathParams":[],"queryParams":[],"bodyFields":[{"name":"applicationId","required":false,"type":"string","description":"Optional application ID override (resolved from auth context when absent)"},{"name":"customerId","required":true,"type":"string","description":"ID of the customer to subscribe"},{"name":"planReference","required":true,"type":"string","description":"Your plan identifier (e.g. \"pro_monthly\")"},{"name":"planName","required":false,"type":"string","description":"Human-readable plan name shown on invoices"},{"name":"interval","required":false,"type":"string","description":"A named interval, or \"custom\" when intervalUnit/intervalCount describe any other cadence"},{"name":"intervalUnit","required":false,"type":"string","description":"Cadence unit. Send with intervalCount instead of, or together with, interval."},{"name":"intervalCount","required":false,"type":"number","description":"Cadence count: every N units. At most one year (8760 hours, 365 days, 52 weeks, 12 months)."},{"name":"totalPayments","required":false,"type":"integer","description":"Makes this an installment plan of exactly this many payments (2 to 60). Cannot be combined with trialEnd or changed later."},{"name":"amount","required":false,"type":"integer","description":"Subscription amount in the smallest currency unit (e.g. cents). Required unless `schedule` is sent."},{"name":"schedule","required":false,"type":"object[]","description":"A custom installment plan: 2–60 payments. Row 0 is charged now and has no gap; each later row has amount + intervalUnit + intervalCount (its gap after the previous payment, 1 hour to 1 year). Exclusive with interval, totalPayments and trialEnd. amount (if sent) must equal schedule[0].amount; currentPeriodEnd is derived."},{"name":"currency","required":false,"type":"string","description":"ISO 4217 currency code (defaults to USD). Normalised to upper case; must match the application’s configured currency (422 currency_mismatch otherwise)."},{"name":"currentPeriodStart","required":true,"description":"ISO 8601 start of the current billing period"},{"name":"currentPeriodEnd","required":false,"description":"ISO 8601 end of the current billing period. Must be after currentPeriodStart and in the future (a small clock-skew grace is allowed) — a past currentPeriodEnd is never renewed."},{"name":"trialEnd","required":false,"description":"ISO 8601 date-time when the trial ends (omit if no trial). Cannot be before currentPeriodStart."},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata stored with the subscription"},{"name":"orderId","required":false,"type":"string","description":"The order that paid for the first period. Links the two in both directions: the order gets `subscriptionId` (and the legacy `metadata.subscription_id`), and this subscription's first invoice gets `orderId`. Use this when you charged the signup yourself and created the subscription afterwards. 404 if the order does not exist in this application and environment."}],"description":"Create a new subscription"},{"method":"GET","path":"/api/v1/subscriptions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a subscription by ID"},{"method":"PATCH","path":"/api/v1/subscriptions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"planReference","required":false,"type":"string"},{"name":"planName","required":false,"type":"string"},{"name":"interval","required":false,"type":"string","description":"A named interval, or \"custom\" when intervalUnit/intervalCount describe any other cadence"},{"name":"intervalUnit","required":false,"type":"string","description":"Cadence unit. Send with intervalCount instead of, or together with, interval."},{"name":"intervalCount","required":false,"type":"number","description":"Cadence count: every N units. At most one year (8760 hours, 365 days, 52 weeks, 12 months)."},{"name":"amount","required":false,"type":"integer","description":"Amount in cents"},{"name":"taxAddress","required":false,"type":"object|null"},{"name":"metadata","required":false,"type":"object"}],"description":"Update a subscription (plan change, amount, interval)"},{"method":"GET","path":"/api/v1/subscriptions/{id}/invoices","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/subscriptions/{id}/invoices/{invoiceId}/refund","pathParams":["id","invoiceId"],"queryParams":[],"bodyFields":[{"name":"amount","required":false,"type":"integer","description":"Minor units. Omit to refund everything still outstanding on the cycle."},{"name":"reason","required":false,"type":"string"},{"name":"intent","required":true,"type":"string","description":"`money_only` returns the money and keeps billing; `refund_and_cancel` also ends the subscription immediately. Required — there is no default.","enum":["money_only","refund_and_cancel"]}],"description":"Refund one of a subscription's billing cycles"},{"method":"POST","path":"/api/v1/subscriptions/{id}/pause","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Pause an active subscription"},{"method":"POST","path":"/api/v1/subscriptions/{id}/retry-charge","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Retry a past-due subscription's failed renewal charge immediately"},{"method":"POST","path":"/api/v1/subscriptions/{id}/waive-period","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string"}],"description":"Forgive a past-due subscription's current period — settle it at zero and advance"},{"method":"POST","path":"/api/v1/subscriptions/{id}/resume","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Resume a paused subscription"},{"method":"POST","path":"/api/v1/subscriptions/{id}/change-plan","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"planReference","required":true,"type":"string","description":"Your plan identifier for the new plan"},{"name":"planName","required":false,"type":"string","description":"Human-readable name for the new plan"},{"name":"interval","required":false,"type":"string","description":"A named interval, or \"custom\" when intervalUnit/intervalCount describe any other cadence"},{"name":"intervalUnit","required":false,"type":"string","description":"Cadence unit. Send with intervalCount instead of, or together with, interval."},{"name":"intervalCount","required":false,"type":"number","description":"Cadence count: every N units. At most one year (8760 hours, 365 days, 52 weeks, 12 months)."},{"name":"amount","required":true,"type":"integer","description":"Amount in the smallest currency unit (e.g. cents)"},{"name":"effective","required":true,"type":"string","description":"When the plan change takes effect","enum":["now","period_end"]}],"description":"Schedule or apply a plan change on a subscription"},{"method":"POST","path":"/api/v1/subscriptions/{id}/change-quantity","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"quantity","required":true,"type":"integer","description":"New seat count"},{"name":"effective","required":true,"type":"string","description":"When the seat change takes effect","enum":["now","period_end"]}],"description":"Change the seat quantity on a subscription (immediate prorated, or deferred to period end)"},{"method":"DELETE","path":"/api/v1/subscriptions/{id}/pending-change","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Cancel a pending scheduled plan change on a subscription"},{"method":"POST","path":"/api/v1/subscriptions/{id}/cancel","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"atPeriodEnd","required":false,"type":"boolean","description":"If true, cancels at the end of the current billing period"},{"name":"refund","required":false,"type":"string","description":"Money to return alongside an immediate cancellation. `prorated` credits the unused part of the current period, capped at what was actually paid for it — if nothing was taken for the current period the subscription is still cancelled, with a refund of 0. `last_cycle` returns the whole last paid cycle. Rejected when atPeriodEnd is true, and with 409 invalid_state on a subscription that is already ca","enum":["none","prorated","last_cycle"]}],"description":"Cancel a subscription (immediately or at period end)"},{"method":"GET","path":"/api/v1/subscriptions/{id}/usage","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List usage items for the subscription's current billing period."},{"method":"POST","path":"/api/v1/subscriptions/{id}/usage","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"kind","required":true,"type":"string"},{"name":"unitCount","required":true,"type":"integer"},{"name":"unitPriceCents","required":true,"type":"integer"}],"description":"Record (upsert) a usage item for the subscription's current billing period."},{"method":"POST","path":"/api/v1/subscriptions/eligibility-check","pathParams":[],"queryParams":[],"bodyFields":[{"name":"paymentMethodId","required":true,"type":"string","description":"customerPaymentMethods row id. Must belong to the authenticated merchant. The server resolves the card fingerprint internally."}],"description":"Pre-flight check whether a payment method is eligible for a free trial on this merchant. Card fingerprint match against any prior subscription with a trialEnd blocks the trial."},{"method":"GET","path":"/api/v1/discounts","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"isActive","required":false,"type":"boolean"},{"name":"code","required":false,"type":"string"},{"name":"type","required":false,"type":"string","enum":["percentage","fixed_amount"]},{"name":"q","required":false,"type":"string","description":"Search discount code, name, type, or metadata."},{"name":"sort","required":false,"type":"string","description":"Sort by creation time.","enum":["asc","desc"]},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List discounts with cursor pagination"},{"method":"POST","path":"/api/v1/discounts","pathParams":[],"queryParams":[],"bodyFields":[{"name":"code","required":false,"type":"string","description":"Leave empty for automatic discounts"},{"name":"name","required":true,"type":"string"},{"name":"type","required":true,"type":"string","enum":["percentage","fixed_amount"]},{"name":"value","required":true,"type":"integer","description":"Percentage as a whole number (25 = 25%) or fixed amount in minor units"},{"name":"conditions","required":false,"type":"object","description":"e.g. { minOrder: 5000 }"},{"name":"usageLimit","required":false,"type":"integer"},{"name":"maxRedemptionsPerCustomer","required":false,"type":"integer|null","description":"Per-customer redemption limit. Use null for unlimited."},{"name":"startsAt","required":false,"type":"string"},{"name":"endsAt","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Create a new discount"},{"method":"GET","path":"/api/v1/discounts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a discount by ID"},{"method":"PATCH","path":"/api/v1/discounts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"code","required":false,"type":"string|null","description":"Leave null for automatic discounts"},{"name":"name","required":false,"type":"string"},{"name":"type","required":false,"type":"string","enum":["percentage","fixed_amount"]},{"name":"value","required":false,"type":"integer"},{"name":"conditions","required":false,"type":"object"},{"name":"usageLimit","required":false,"type":"integer|null"},{"name":"maxRedemptionsPerCustomer","required":false,"type":"integer|null","description":"Per-customer redemption limit. Use null for unlimited."},{"name":"isActive","required":false,"type":"boolean"},{"name":"startsAt","required":false,"type":"string|null"},{"name":"endsAt","required":false,"type":"string|null"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a discount"},{"method":"DELETE","path":"/api/v1/discounts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Delete a discount"},{"method":"POST","path":"/api/v1/discounts/validate","pathParams":[],"queryParams":[],"bodyFields":[{"name":"code","required":true,"type":"string"},{"name":"orderTotal","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"customerId","required":false,"type":"string"}],"description":"Validate a discount code against an order total"},{"method":"POST","path":"/api/v1/discounts/preview","pathParams":[],"queryParams":[],"bodyFields":[{"name":"code","required":true,"type":"string"},{"name":"currency","required":true,"type":"string"},{"name":"subtotal","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"customerId","required":false,"type":"string"},{"name":"lineItems","required":false,"type":"object[]"}],"description":"Preview a discount code against a subtotal without mutating a cart"},{"method":"GET","path":"/api/v1/quotes","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","description":"Comma-separated status filter, e.g. proposed,accepted"},{"name":"q","required":false,"type":"string","description":"Search quote number, customer email, or buyer reference"},{"name":"assignedMemberId","required":false,"type":"string"},{"name":"customerId","required":false,"type":"string"},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List quotes with cursor pagination"},{"method":"POST","path":"/api/v1/quotes","pathParams":[],"queryParams":[],"bodyFields":[{"name":"status","required":false,"type":"string","enum":["draft","requested"]},{"name":"customerId","required":false,"type":"string|null"},{"name":"customerEmail","required":false,"type":"string|null"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"source","required":false,"type":"string","enum":["dashboard","api"]},{"name":"assignedMemberId","required":false,"type":"string|null"},{"name":"currency","required":false,"type":"string"},{"name":"internalNotes","required":false,"type":"string|null"},{"name":"items","required":false,"type":"object[]"},{"name":"paymentTerms","required":false,"type":"object","description":"pay_in_full | net_terms (netN 1-365) | deposit_balance (deposit percent/fixed + balanceNetN)"},{"name":"expiresAt","required":false,"description":"ISO 8601 date-time, or null to clear"},{"name":"buyerNote","required":false,"type":"string|null"},{"name":"leadTime","required":false,"type":"string|null"},{"name":"shippingMode","required":false,"type":"string","enum":["none","flat","checkout_calculated","free"]},{"name":"shippingFlatAmount","required":false,"type":"integer|null"},{"name":"collect","required":false,"type":"object","description":"Address steps the hosted checkout shows after acceptance. Omit to leave unchanged; null on a flag restores the derived default."},{"name":"metadata","required":false,"type":"object"}],"description":"Create a quote (draft, or requested for RFQ intake)"},{"method":"GET","path":"/api/v1/quotes/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a quote with revisions, comments, and timeline (merchant view)"},{"method":"PATCH","path":"/api/v1/quotes/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"assignedMemberId","required":false,"type":"string|null"},{"name":"customerId","required":false,"type":"string|null"},{"name":"customerEmail","required":false,"type":"string|null"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"internalNotes","required":false,"type":"string|null"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"},{"name":"status","required":false,"type":"string","enum":["archived","declined"]},{"name":"declinedReason","required":false,"type":"string|null","description":"With status 'declined': the reason shown to the buyer."}],"description":"Update quote assignment, linkage, internal notes, or archive it"},{"method":"POST","path":"/api/v1/quotes/{id}/revisions","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Start a new working revision cloned from the latest issued revision"},{"method":"PATCH","path":"/api/v1/quotes/{id}/revisions/{revId}","pathParams":["id","revId"],"queryParams":[],"bodyFields":[{"name":"items","required":false,"type":"object[]"},{"name":"paymentTerms","required":false,"type":"object","description":"pay_in_full | net_terms (netN 1-365) | deposit_balance (deposit percent/fixed + balanceNetN)"},{"name":"expiresAt","required":false,"description":"ISO 8601 date-time, or null to clear"},{"name":"buyerNote","required":false,"type":"string|null"},{"name":"leadTime","required":false,"type":"string|null"},{"name":"shippingMode","required":false,"type":"string","enum":["none","flat","checkout_calculated","free"]},{"name":"shippingFlatAmount","required":false,"type":"integer|null"},{"name":"collect","required":false,"type":"object","description":"Address steps the hosted checkout shows after acceptance. Omit to leave unchanged; null on a flag restores the derived default."},{"name":"metadata","required":false,"type":"object"},{"name":"changeSummary","required":false,"type":"string|null"}],"description":"Edit the working revision (items, terms, expiry, notes)"},{"method":"POST","path":"/api/v1/quotes/{id}/issue","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Freeze the working revision, supersede the prior one, and propose the quote"},{"method":"POST","path":"/api/v1/quotes/{id}/rotate-link","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Rotate the buyer link token (invalidates the old link)"},{"method":"POST","path":"/api/v1/quotes/{id}/comments","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"body","required":true,"type":"string"},{"name":"visibility","required":false,"type":"string","enum":["shared","internal"]},{"name":"revisionId","required":false,"type":"string|null"}],"description":"Add a merchant comment (shared with the buyer, or internal)"},{"method":"POST","path":"/api/v1/carts/{id}/request-quote","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"buyerReference","required":false,"type":"string|null"},{"name":"note","required":false,"type":"string|null"}],"description":"Snapshot a cart's lines into a requested quote (the cart is unchanged)"},{"method":"POST","path":"/api/v1/quotes/{id}/accept","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"revisionId","required":true,"type":"string"},{"name":"acceptedByName","required":true,"type":"string"},{"name":"acceptedByEmail","required":true,"type":"string"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"itemSelections","required":false,"type":"object[]"},{"name":"reason","required":false,"type":"string|null"}],"description":"Record a rep-given acceptance (phone/email deal) and start checkout (spec §8, §9)"},{"method":"GET","path":"/api/v1/quote-links/{token}","pathParams":["token"],"queryParams":[],"bodyFields":null,"description":"Get a quote by its buyer link token (public, buyer-shaped)"},{"method":"POST","path":"/api/v1/quote-links/{token}/view","pathParams":["token"],"queryParams":[],"bodyFields":[],"description":"Record a buyer view of the quote link (throttled quote.viewed webhook)"},{"method":"POST","path":"/api/v1/quote-links/{token}/comments","pathParams":["token"],"queryParams":[],"bodyFields":[{"name":"authorName","required":false,"type":"string|null"},{"name":"authorEmail","required":false,"type":"string|null"},{"name":"body","required":true,"type":"string"}],"description":"Add a buyer comment (always shared)"},{"method":"POST","path":"/api/v1/quote-links/{token}/request-revision","pathParams":["token"],"queryParams":[],"bodyFields":[{"name":"authorName","required":false,"type":"string|null"},{"name":"authorEmail","required":false,"type":"string|null"},{"name":"message","required":false,"type":"string|null"}],"description":"Ask for changes instead of accepting the current proposal"},{"method":"POST","path":"/api/v1/quote-links/{token}/decline","pathParams":["token"],"queryParams":[],"bodyFields":[{"name":"authorName","required":false,"type":"string|null"},{"name":"authorEmail","required":false,"type":"string|null"},{"name":"reason","required":false,"type":"string|null"}],"description":"Decline the quote"},{"method":"POST","path":"/api/v1/quote-links/{token}/accept","pathParams":["token"],"queryParams":[],"bodyFields":[{"name":"revisionId","required":true,"type":"string"},{"name":"acceptedByName","required":true,"type":"string"},{"name":"acceptedByEmail","required":true,"type":"string"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"itemSelections","required":false,"type":"object[]"}],"description":"Accept the quote and start checkout (spec §8)"},{"method":"POST","path":"/api/v1/quote-links/{token}/checkout","pathParams":["token"],"queryParams":[],"bodyFields":[],"description":"Return an accepted quote to a live checkout session (spec §8.2)"},{"method":"GET","path":"/api/v1/quote-links/{token}/pdf","pathParams":["token"],"queryParams":[],"bodyFields":null,"description":"Download the quote PDF (302 redirect to a short-lived signed URL; lazy-rendered from the frozen issued revision)"},{"method":"GET","path":"/api/v1/quote-request-forms","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List RFQ intake forms for the application + environment"},{"method":"POST","path":"/api/v1/quote-request-forms","pathParams":[],"queryParams":[],"bodyFields":[{"name":"slug","required":true,"type":"string"},{"name":"title","required":false,"type":"string|null"},{"name":"introText","required":false,"type":"string|null"},{"name":"successMessage","required":false,"type":"string|null"},{"name":"redirectUrl","required":false,"type":"string|null","description":"Must be http(s)"},{"name":"fields","required":false,"type":"object"}],"description":"Create a hosted RFQ intake form (token revealed once)"},{"method":"PATCH","path":"/api/v1/quote-request-forms/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"isActive","required":false,"type":"boolean"},{"name":"title","required":false,"type":"string|null"},{"name":"introText","required":false,"type":"string|null"},{"name":"successMessage","required":false,"type":"string|null"},{"name":"redirectUrl","required":false,"type":"string|null","description":"Must be http(s)"},{"name":"fields","required":false,"type":"object"}],"description":"Update an RFQ intake form (activate/deactivate, texts, fields)"},{"method":"POST","path":"/api/v1/quote-request-forms/{id}/rotate-token","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Rotate the form token (old URL 404s immediately; new token revealed once)"},{"method":"GET","path":"/api/v1/quote-request-forms/{token}/public","pathParams":["token"],"queryParams":[],"bodyFields":null,"description":"Public form config for the hosted RFQ page (token-authenticated)"},{"method":"POST","path":"/api/v1/quote-requests","pathParams":[],"queryParams":[],"bodyFields":[{"name":"formToken","required":true,"type":"string"},{"name":"email","required":true,"type":"string"},{"name":"name","required":false,"type":"string|null"},{"name":"companyName","required":false,"type":"string|null"},{"name":"phone","required":false,"type":"string|null"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"message","required":false,"type":"string|null"},{"name":"items","required":false,"type":"object[]","description":"Lines the buyer is asking about. Seeded into the quote's working revision unpriced — targetUnitPrice is the buyer's ask, never the quoted price."},{"name":"cartId","required":false,"type":"string|null","description":"A cart the buyer already filled; its lines join the request. Resolved inside the form's own application + environment."},{"name":"website","required":false,"type":"string|null","description":"Honeypot — must be empty"},{"name":"formLoadedAt","required":false,"type":"number","description":"Client mount time (ms epoch); min fill time enforced"},{"name":"turnstileToken","required":false,"type":"string"}],"description":"Public RFQ submission (honeypot + min-fill-time + rate limit + optional Turnstile)"},{"method":"GET","path":"/api/v1/webhooks","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List all webhooks for the organization. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"POST","path":"/api/v1/webhooks","pathParams":[],"queryParams":[],"bodyFields":[{"name":"url","required":true,"type":"string"},{"name":"events","required":true,"type":"string[]","description":"Event types (e.g. [\"order.created\", \"payment.captured\"])"},{"name":"secret","required":false,"type":"string","description":"HMAC secret (auto-generated if omitted)"},{"name":"description","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Register a new webhook. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"GET","path":"/api/v1/webhooks/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a webhook by ID. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"PATCH","path":"/api/v1/webhooks/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"url","required":false,"type":"string"},{"name":"events","required":false,"type":"string[]"},{"name":"isActive","required":false,"type":"boolean"},{"name":"description","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a webhook. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"DELETE","path":"/api/v1/webhooks/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Delete a webhook. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"GET","path":"/api/v1/webhooks/{id}/deliveries","pathParams":["id"],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","enum":["pending","success","failed","dead_letter"]}],"bodyFields":null,"description":"List delivery attempts for a webhook. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"POST","path":"/api/v1/webhooks/{webhookId}/deliveries/{id}/retry","pathParams":["webhookId","id"],"queryParams":[],"bodyFields":null,"description":"Retry a failed webhook delivery. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"GET","path":"/api/v1/extensions","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"q","required":false,"type":"string"},{"name":"installable","required":false,"type":"string","enum":["true","false"]},{"name":"lifecycle","required":false,"type":"string","enum":["draft","private","public"]}],"bodyFields":null,"description":"List available extensions"},{"method":"POST","path":"/api/v1/extensions","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string"},{"name":"description","required":false,"type":"string"},{"name":"version","required":false,"type":"string"},{"name":"author","required":false,"type":"string"},{"name":"iconUrl","required":false,"type":"string"},{"name":"homepageUrl","required":false,"type":"string"},{"name":"scopes","required":true,"type":"string[]","description":"Permission scopes the extension requires"},{"name":"eventSubscriptions","required":false,"type":"string[]","description":"Webhook event types the extension subscribes to"},{"name":"iframeUrl","required":false,"type":"string","description":"HTTPS URL to embed as an iframe panel in the dashboard"},{"name":"webhookUrl","required":false,"type":"string","description":"HTTPS endpoint that receives subscribed events"},{"name":"configSchema","required":false,"type":"object","description":"JSON Schema defining accepted configuration"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Register a new extension"},{"method":"GET","path":"/api/v1/extensions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get extension by ID"},{"method":"PATCH","path":"/api/v1/extensions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"description","required":false,"type":"string"},{"name":"version","required":false,"type":"string"},{"name":"author","required":false,"type":"string"},{"name":"iconUrl","required":false,"type":"string"},{"name":"homepageUrl","required":false,"type":"string"},{"name":"scopes","required":false,"type":"string[]"},{"name":"eventSubscriptions","required":false,"type":"string[]"},{"name":"iframeUrl","required":false,"type":"string"},{"name":"webhookUrl","required":false,"type":"string"},{"name":"configSchema","required":false,"type":"object"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update extension metadata"},{"method":"DELETE","path":"/api/v1/extensions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Delete an extension"},{"method":"POST","path":"/api/v1/extensions/{id}/client-credentials","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"installCallbackUrl","required":false,"type":"string","description":"HTTPS endpoint that receives the signed install callback. Plain http:// is refused."}],"summary":"Issue (or rotate) client credentials for a catalog extension","description":"Generates a new clientId/clientSecret pair so the extension can fetch its own per-install credentials with no human copy-pasting secrets. Only the secret's SHA-256 digest is stored — the raw secret is returned here once and never again. Calling this again on an extension that already has credentials rotates them (the previous secret stops verifying immediately). Dashboard-only: requires `extensions:write` plus the develop permission check, and is not on the extension_client allow-list."},{"method":"GET","path":"/api/v1/extensions/{id}/versions","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List versions for an extension, ordered newest first"},{"method":"POST","path":"/api/v1/extensions/{id}/versions","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"version","required":true,"type":"string","description":"Semantic version string, e.g. \"1.2.0\""},{"name":"changelog","required":false,"type":"string","description":"Human-readable changelog for this version"}],"description":"Create a new draft version of an extension by snapshotting the current working-copy manifest"},{"method":"GET","path":"/api/v1/extensions/{id}/scripts","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"List an extension's buyer-facing scripts"},{"method":"POST","path":"/api/v1/extensions/{id}/scripts","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Create or replace a buyer-facing script on an extension"},{"method":"PATCH","path":"/api/v1/extensions/{id}/scripts/{scriptId}","pathParams":["id","scriptId"],"queryParams":[],"bodyFields":null,"summary":"Update a buyer-facing script"},{"method":"DELETE","path":"/api/v1/extensions/{id}/scripts/{scriptId}","pathParams":["id","scriptId"],"queryParams":[],"bodyFields":null,"summary":"Delete a buyer-facing script"},{"method":"POST","path":"/api/v1/extensions/{id}/versions/{vid}/publish","pathParams":["id","vid"],"queryParams":[],"bodyFields":null,"description":"Publish a draft version of an extension"},{"method":"POST","path":"/api/v1/extensions/{id}/lifecycle","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"lifecycle","required":true,"type":"string","enum":["draft","private","public"]}],"description":"Update the lifecycle state of an extension (draft → private → public)"},{"method":"POST","path":"/api/v1/extensions/{id}/install","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"versionId","required":false,"type":"string","description":"Specific version to pin. Omit to use the latest published version."},{"name":"config","required":false,"type":"object","description":"Configuration values for this installation"}],"description":"Install an extension for the organization. Returns a one-time API key."},{"method":"POST","path":"/api/v1/extensions/{id}/uninstall","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Uninstall an extension (deactivates API key and webhooks)"},{"method":"POST","path":"/api/v1/extensions/{id}/suspend","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Suspend an installed extension (deactivates API key and webhooks, can be reinstalled)"},{"method":"PATCH","path":"/api/v1/installations/{id}/config","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"config","required":true,"type":"object"}],"description":"Update configuration for an installed extension"},{"method":"GET","path":"/api/v1/installations","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","enum":["active","suspended","uninstalled"]}],"bodyFields":null,"description":"List installed extensions for the organization"},{"method":"POST","path":"/api/v1/installations/{id}/upgrade","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"targetVersionId","required":true,"type":"string","description":"ID of the target extension version to upgrade to"},{"name":"acknowledgedNewScripts","required":false,"type":"boolean","description":"Consent for scripts the target version adds or escalates (new script, dom tier, wider consent category, higher PII grade, or a new external domain)."},{"name":"acknowledgedNewScopes","required":false,"type":"boolean","description":"Set to true to consent to new scopes added by the target version"}],"description":"Upgrade an installation to a target version. Returns 409 if the new version adds scopes that require consent."},{"method":"POST","path":"/api/v1/installations/{id}/launch-token","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Mint a short-lived RS256 session JWT for an iframe extension. The token carries full installation context and expires in 10 minutes. Re-calling this endpoint refreshes the token (no separate refresh route)."},{"method":"GET","path":"/api/v1/installations/{id}/webhook-secret","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Read this installation's webhook signing secret","description":"Returns the signing secret for the installation's managed webhook endpoint, so an extension can verify delivery signatures without a human copying the secret out of the dashboard. Requires authentication but no particular scope: the caller must present the installation's own API key or extension session token, the extension's own client credential (Basic clientId:clientSecret), or be a dashboard user permitted to manage installs. The secret is stable across uninstall/reinstall."},{"method":"POST","path":"/api/v1/installations/{id}/rotate-webhook-secret","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"graceSeconds","required":false,"type":"integer"}],"summary":"Rotate this installation's webhook signing secret","description":"Mints a new signing secret for the installation's managed webhook endpoint and returns it once. For `graceSeconds` (default 86400, max 604800) every delivery is signed with both the outgoing and the new secret — one `v1=` digest each, new last — so a receiver that verifies against every digest never fails a delivery, and one that keeps only the last digest verifies from the moment it holds the new secret. `graceSeconds: 0` revokes the old secret immediately (use for a leaked secret). A signed `extension.webhook_secret_rotated` event is delivered to the endpoint. Same authorization as reading t"},{"method":"POST","path":"/api/v1/installations/{id}/api-key","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"graceSeconds","required":false,"type":"integer"}],"summary":"Mint a fresh API key for this installation and grace-expire its predecessor","description":"API keys are hashed at rest, so there is nothing to read back — this issues a NEW key with the scopes of the installation's pinned version and returns the raw value once. The key it replaces keeps working for `graceSeconds` (default 86400, max 604800) via `api_keys.expires_at`, so an extension that restarts mid-delivery never locks itself out. Same authorization as the webhook-secret routes: the installation's own extension-client credential, or a dashboard user permitted to manage installs."},{"method":"GET","path":"/api/v1/extensions/me/installations","pathParams":[],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"cursor","required":false,"type":"string"}],"bodyFields":null,"summary":"List this extension's own installations","description":"Lets an extension enumerate its own installs with no human copy-pasting secrets. This is the recovery path if an install callback is dropped, never configured, or the extension loses its datastore. `extension_client`-only: any other credential gets 404, not 403 — we do not confirm this route exists to a credential with no business here."},{"method":"GET","path":"/api/v1/installations/{id}/deliveries","pathParams":["id"],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"offset","required":false,"type":"integer"}],"bodyFields":null,"description":"List webhook deliveries for an extension installation (most recent first)"},{"method":"POST","path":"/api/v1/installations/{id}/deliveries/{deliveryId}/replay","pathParams":["id","deliveryId"],"queryParams":[],"bodyFields":[],"description":"Replay a webhook delivery for an extension installation"},{"method":"POST","path":"/api/v1/installations/{id}/test","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Send a verification ping to an extension installation webhook endpoint"},{"method":"GET","path":"/api/v1/extensions/{id}/listing","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PUT","path":"/api/v1/extensions/{id}/listing","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/extensions/{id}/readiness","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/extensions/{id}/reviews","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/{id}/reviews","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/extensions/{id}/reviews/{sid}","pathParams":["id","sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/{id}/reviews/{sid}/comments","pathParams":["id","sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/{id}/reviews/{sid}/withdraw","pathParams":["id","sid"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/publisher/terms","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/publisher/accept-terms","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/extensions/domains","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/domains","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/domains/{id}/verify","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/affiliates/me/code","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get or create affiliate code"},{"method":"POST","path":"/api/v1/affiliates/me/code/regenerate","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Regenerate affiliate code"},{"method":"GET","path":"/api/v1/affiliates/me/stats","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get affiliate stats"},{"method":"GET","path":"/api/v1/affiliates/me/signups","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List referred signups"},{"method":"POST","path":"/api/v1/partner/applications","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Apply for partner status"},{"method":"GET","path":"/api/v1/partner/me/profile","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get partner profile"},{"method":"GET","path":"/api/v1/partner/me/referrals","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List partner referrals"},{"method":"GET","path":"/api/v1/partner/me/seats","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List partner seats in client workspaces"},{"method":"GET","path":"/api/v1/partner/me/commissions","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get commission stats"},{"method":"POST","path":"/api/v1/partner/trials","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Create trial for client"},{"method":"POST","path":"/api/v1/partner/trials/{referralId}/promote","pathParams":["referralId"],"queryParams":[],"bodyFields":null,"summary":"Hand off client workspace to client ownership"},{"method":"POST","path":"/api/v1/partner/trials/{referralId}/revoke-handoff","pathParams":["referralId"],"queryParams":[],"bodyFields":null,"summary":"Undo a handoff while the client ownership invite is outstanding"},{"method":"POST","path":"/api/v1/partner/trials/{referralId}/claim-billing","pathParams":["referralId"],"queryParams":[],"bodyFields":null,"summary":"Partner claims billing responsibility"},{"method":"GET","path":"/api/v1/partner-seats","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List partner seats on this workspace"},{"method":"PATCH","path":"/api/v1/partner-seats/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Update seat permissions"},{"method":"DELETE","path":"/api/v1/partner-seats/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Remove a partner seat"},{"method":"GET","path":"/api/v1/events/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a single event by ID"},{"method":"GET","path":"/api/v1/events","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"type","required":false,"type":"string","description":"Filter by event type"},{"name":"entityType","required":false,"type":"string","description":"Filter by entity type"},{"name":"entityId","required":false,"type":"string","description":"Filter by entity ID"}],"bodyFields":null,"description":"List events (immutable audit log)"},{"method":"GET","path":"/api/v1/scopes","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/event-types","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/whoami","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Identify the calling credential","description":"Returns the credential type, granted scopes, and the workspace, application and environment the credential is pinned to. Requires authentication but no particular scope."},{"method":"GET","path":"/.well-known/openai-apps-challenge","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/.well-known/extension-jwks.json","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/.well-known/oauth-authorization-server","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/.well-known/oauth-protected-resource","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/oauth/clients/{clientId}","pathParams":["clientId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/checkout/sessions","pathParams":[],"queryParams":[],"bodyFields":[{"name":"applicationId","required":true,"type":"string"},{"name":"cartId","required":false,"type":"string"},{"name":"externalCartId","required":false,"type":"string"},{"name":"customerEmail","required":false,"type":"string"},{"name":"customer","required":false,"type":"object"},{"name":"returnUrl","required":true,"type":"string"},{"name":"cancelUrl","required":true,"type":"string"},{"name":"allowedMethods","required":false,"type":"string[]"},{"name":"paymentTerms","required":false,"type":"object"},{"name":"recurring","required":false,"type":"object"},{"name":"collect","required":false,"type":"object"},{"name":"metadata","required":false,"type":"object"},{"name":"discountCode","required":false,"type":"string"},{"name":"clientContext","required":false,"type":"object"}],"description":"Create a new hosted checkout session"},{"method":"GET","path":"/api/v1/checkout/sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a checkout session by ID"},{"method":"DELETE","path":"/api/v1/checkout/sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Cancel a checkout session"},{"method":"GET","path":"/api/v1/checkout-sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a customer-facing checkout session by ID (public)"},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/embed-config","pathParams":["id"],"queryParams":[{"name":"parentOrigin","required":false,"type":"string","description":"Origin of the page embedding the checkout. When sent, the response adds `parentOriginAllowed`: whether that origin is on the application's allowed origins, wildcard entries included."}],"bodyFields":null,"description":"Get customer-facing embed config by checkout session ID (public)"},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/cart","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a customer-facing checkout session cart by session ID (public)"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/calculate","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Calculate customer-facing checkout session totals by session ID (public)"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/validate-address","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Validate a customer-facing checkout address by session ID (public)"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Apply a customer-facing checkout discount by session ID (public)"},{"method":"DELETE","path":"/api/v1/checkout-sessions/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Remove a customer-facing checkout discount by session ID (public)"},{"method":"POST","path":"/api/v1/checkout/sessions/{id}/complete","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"email","required":false,"type":"string"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"billingAddress","required":false,"type":"object"},{"name":"billingSameAsShipping","required":false,"type":"boolean"},{"name":"paymentMethod","required":true,"type":"string","description":"`embedded` completes a card payment taken by the payment embed; `net30` issues an invoice on terms. `card` names the card category in `allowedMethods` but is not a completion rail: it is rejected with 422 `payment_method_not_supported`. Use `embedded`.","enum":["net30","card","embedded"]},{"name":"netDays","required":false,"type":"integer"},{"name":"termsAccepted","required":false,"type":"boolean"},{"name":"termsSnapshot","required":false,"type":"string"},{"name":"invoiceNumber","required":false,"type":"string"},{"name":"net30Acceptance","required":false,"type":"object"},{"name":"paymentMethodId","required":false,"type":"string","description":"Charge a card the customer already saved instead of collecting a new one. Ownership is verified against this session's customer before anything is charged; a card belonging to anyone else is refused."},{"name":"paymentToken","required":false,"type":"string"},{"name":"processorCheckoutSessionId","required":false,"type":"string"},{"name":"processorTransactionId","required":false,"type":"string"},{"name":"clientContext","required":false,"type":"object"}],"description":"Complete a checkout session"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/complete","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"email","required":false,"type":"string"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"billingAddress","required":false,"type":"object"},{"name":"billingSameAsShipping","required":false,"type":"boolean"},{"name":"paymentMethod","required":true,"type":"string","description":"`embedded` completes a card payment taken by the payment embed; `net30` issues an invoice on terms. `card` names the card category in `allowedMethods` but is not a completion rail: it is rejected with 422 `payment_method_not_supported`. Use `embedded`.","enum":["net30","card","embedded"]},{"name":"netDays","required":false,"type":"integer"},{"name":"termsAccepted","required":false,"type":"boolean"},{"name":"termsSnapshot","required":false,"type":"string"},{"name":"invoiceNumber","required":false,"type":"string"},{"name":"net30Acceptance","required":false,"type":"object"},{"name":"paymentMethodId","required":false,"type":"string","description":"Charge a card the customer already saved instead of collecting a new one. Ownership is verified against this session's customer before anything is charged; a card belonging to anyone else is refused."},{"name":"paymentToken","required":false,"type":"string"},{"name":"processorCheckoutSessionId","required":false,"type":"string"},{"name":"processorTransactionId","required":false,"type":"string"},{"name":"clientContext","required":false,"type":"object"}],"description":"Public customer-facing complete"},{"method":"POST","path":"/api/v1/providers/{provider}/webhooks/{connectionId}","pathParams":["provider","connectionId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/payment-providers/{provider}/webhooks","pathParams":["provider"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/payment-providers/{provider}/webhooks/{connectionId}","pathParams":["provider","connectionId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/checkout-sessions/embed-token","pathParams":[],"queryParams":[],"bodyFields":[{"name":"amount","required":true,"type":"integer","description":"Amount in minor units (e.g. cents)"},{"name":"currency","required":true,"type":"string","description":"ISO 4217 currency code"},{"name":"country","required":false,"type":"string","description":"ISO 3166-1 alpha-2 country code"},{"name":"externalCartId","required":false,"type":"string","description":"Optional external cart reference"},{"name":"buyerExternalIdentifier","required":false,"type":"string","description":"Optional Gr4vy buyer external identifier. When set, Gr4vy associates the resulting stored payment method with this buyer so future charges can reference it by id. Required for the platform-billing card-vault flow; omitted for one-shot checkout sessions."},{"name":"recurring","required":false,"type":"boolean","description":"When true, this embed captures a card for recurring/merchant-initiated billing: the Gr4vy widget is rendered with paymentSource=recurring + store=true (card-only, vaulted) and the buyer is pinned for re-mint. Requires buyerExternalIdentifier. Defaults to false (one-shot payment showing all enabled methods)."},{"name":"addCard","required":false,"type":"boolean","description":"When true (with recurring), the embed is a pure add-a-card flow: checkout-web renders the Gr4vy widget with display='addOnly' (just a new-card form, no stored methods, no checkout framing) and stores the card for the pinned buyer. Use for 'manage payment methods → add card'. Defaults to false."}],"description":"Mint a Gr4vy Embed token for card capture. The token is scoped to a server-side checkout session."},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/embed-token","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Re-mint a Gr4vy Embed JWT for an existing throttle checkout session. Anonymous; the session id is the only secret needed."},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/card-session","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Start a Secure Fields card session (hosted checkout, no API key)"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/card-session","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Start a Secure Fields card session for a checkout session"},{"method":"GET","path":"/api/v1/api-keys","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List API keys for the calling merchant"},{"method":"POST","path":"/api/v1/api-keys","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"scopes","required":true,"type":"string[]"}],"summary":"Create a new API key (Clerk JWT only)"},{"method":"DELETE","path":"/api/v1/api-keys/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Revoke (soft-delete) an API key"},{"method":"POST","path":"/api/v1/api-keys/{id}/rotate","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"overlapHours","required":false,"type":"integer"}],"summary":"Rotate an API key with an overlap window (Clerk JWT only)"},{"method":"POST","path":"/api/v1/oauth/authorize","pathParams":[],"queryParams":[],"bodyFields":[{"name":"clientId","required":true,"type":"string"},{"name":"redirectUri","required":true,"type":"string"},{"name":"scope","required":true,"type":"string"},{"name":"codeChallenge","required":true,"type":"string"},{"name":"state","required":true,"type":"string"},{"name":"resource","required":false,"type":"string"},{"name":"workspaceId","required":true,"type":"string"},{"name":"applicationId","required":true,"type":"string"},{"name":"environmentId","required":true,"type":"string"},{"name":"applicationIds","required":false,"type":"string[]"}],"summary":"Approve an OAuth authorization request and mint a code (Clerk JWT only)"},{"method":"GET","path":"/api/v1/oauth-grants","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List OAuth grants (Connected Apps) for the caller workspace"},{"method":"DELETE","path":"/api/v1/oauth-grants/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Revoke an OAuth grant (Connected Apps)"},{"method":"GET","path":"/api/v1/merchants/me","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get current merchant"},{"method":"PATCH","path":"/api/v1/merchants/me","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"logoUrl","required":false,"type":"null"}],"summary":"Update merchant display name. Pass `logoUrl: null` to clear the logo. To set a logo, use POST /v1/merchants/me/logo."},{"method":"POST","path":"/v1/storefront/auth/register","pathParams":[],"queryParams":[],"bodyFields":[{"name":"email","required":true,"type":"string"},{"name":"password","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/login","pathParams":[],"queryParams":[],"bodyFields":[{"name":"email","required":true,"type":"string"},{"name":"password","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/refresh","pathParams":[],"queryParams":[],"bodyFields":[{"name":"refreshToken","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/logout","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/auth/logout-all","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/auth/verify-email","pathParams":[],"queryParams":[],"bodyFields":[{"name":"token","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/verify-email/resend","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/auth/forgot-password","pathParams":[],"queryParams":[],"bodyFields":[{"name":"email","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/reset-password","pathParams":[],"queryParams":[],"bodyFields":[{"name":"token","required":true,"type":"string"},{"name":"password","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/step-up","pathParams":[],"queryParams":[],"bodyFields":[{"name":"password","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/me/change-password","pathParams":[],"queryParams":[],"bodyFields":[{"name":"password","required":true,"type":"string"}]},{"method":"GET","path":"/v1/storefront/me","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/v1/storefront/me","pathParams":[],"queryParams":[],"bodyFields":[{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"company","required":false,"type":"string|null"},{"name":"acceptsMarketing","required":false,"type":"boolean"}]},{"method":"GET","path":"/v1/storefront/me/sessions","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/v1/storefront/me/sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/addresses","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/addresses","pathParams":[],"queryParams":[],"bodyFields":[{"name":"label","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"addressLine1","required":true,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":true,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":true,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"isDefault","required":false,"type":"boolean"}]},{"method":"PATCH","path":"/v1/storefront/me/addresses/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"label","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"addressLine1","required":false,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":false,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":false,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"isDefault","required":false,"type":"boolean"}]},{"method":"DELETE","path":"/v1/storefront/me/addresses/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/payment-methods","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/v1/storefront/me/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"isDefault","required":true,"type":"string","enum":["true","false"]}]},{"method":"DELETE","path":"/v1/storefront/me/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/payment-methods/embed-token","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/payment-methods/confirm","pathParams":[],"queryParams":[],"bodyFields":[{"name":"transactionId","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/me/carts/{cartId}/claim","pathParams":["cartId"],"queryParams":[],"bodyFields":[]},{"method":"GET","path":"/v1/storefront/me/orders","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string"},{"name":"limit","required":false,"type":"integer"}],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/orders/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/invoices","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string"},{"name":"limit","required":false,"type":"integer"}],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/invoices/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/subscriptions","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string"},{"name":"limit","required":false,"type":"integer"}],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/subscriptions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/invoices/{id}/pdf","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/subscriptions/{id}/pause","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/subscriptions/{id}/resume","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/subscriptions/{id}/cancel","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"atPeriodEnd","required":false,"type":"string","enum":["true","false"]}]},{"method":"POST","path":"/v1/storefront/me/orders/{id}/cancel","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":false,"type":"string"}]},{"method":"POST","path":"/v1/storefront/me/orders/{id}/return-request","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":false,"type":"string"},{"name":"items","required":true,"type":"object[]"}]},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/payment-methods","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"List payment methods available for a checkout session (public)"},{"method":"GET","path":"/api/v1/connectors","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List configured connectors for the calling merchant"},{"method":"POST","path":"/api/v1/connectors","pathParams":[],"queryParams":[],"bodyFields":[{"name":"paymentServiceDefinitionId","required":true,"type":"string"},{"name":"displayName","required":true,"type":"string"},{"name":"fields","required":true,"type":"object[]"},{"name":"acceptedCountries","required":false,"type":"string[]"},{"name":"acceptedCurrencies","required":false,"type":"string[]"},{"name":"active","required":false,"type":"boolean"}],"summary":"Create a new connector for the calling merchant"},{"method":"GET","path":"/api/v1/connectors/available","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List available connector types"},{"method":"GET","path":"/api/v1/connectors/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get a configured connector by id"},{"method":"PATCH","path":"/api/v1/connectors/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentServiceDefinitionId","required":false,"type":"string"},{"name":"displayName","required":false,"type":"string"},{"name":"fields","required":false,"type":"object[]"},{"name":"acceptedCountries","required":false,"type":"string[]"},{"name":"acceptedCurrencies","required":false,"type":"string[]"},{"name":"active","required":false,"type":"boolean"}],"summary":"Update a connector for the calling merchant"},{"method":"DELETE","path":"/api/v1/connectors/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Delete a connector for the calling merchant"},{"method":"GET","path":"/api/v1/payment-routing","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the card-transaction routing config"},{"method":"PUT","path":"/api/v1/payment-routing","pathParams":[],"queryParams":[],"bodyFields":[{"name":"defaultCascade","required":true,"type":"string[]"},{"name":"rules","required":true,"type":"object[]"}],"summary":"Replace the card-transaction routing config"},{"method":"GET","path":"/api/v1/routing-connectors","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List connectors eligible for a routing cascade"},{"method":"GET","path":"/api/v1/routing-payment-methods","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List Gr4vy payment methods available to routing/decline rules"},{"method":"GET","path":"/api/v1/other-routing","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the non-card (redirect-transaction) routing config"},{"method":"PUT","path":"/api/v1/other-routing","pathParams":[],"queryParams":[],"bodyFields":[{"name":"rules","required":true,"type":"object[]"}],"summary":"Replace the non-card routing config"},{"method":"GET","path":"/api/v1/card-decline","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the card-transaction decline rules"},{"method":"PUT","path":"/api/v1/card-decline","pathParams":[],"queryParams":[],"bodyFields":[{"name":"rules","required":true,"type":"object[]"}],"summary":"Replace the card-transaction decline rules"},{"method":"GET","path":"/api/v1/other-decline","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the non-card (other) decline rules"},{"method":"PUT","path":"/api/v1/other-decline","pathParams":[],"queryParams":[],"bodyFields":[{"name":"rules","required":true,"type":"object[]"}],"summary":"Replace the non-card (other) decline rules"},{"method":"POST","path":"/api/v1/connectors/stripe/install-link","pathParams":[],"queryParams":[],"bodyFields":[],"summary":"Begin Stripe one-click connect"},{"method":"POST","path":"/api/v1/connectors/stripe/connect-key","pathParams":[],"queryParams":[],"bodyFields":[{"name":"secretKey","required":true,"type":"string"}],"summary":"Complete Stripe connect by pasting the restricted key"},{"method":"GET","path":"/api/v1/connectors/stripe/readiness","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Raw-card (PCI) readiness for the live Stripe connection"},{"method":"POST","path":"/api/v1/connectors/stripe/connect-oauth","pathParams":[],"queryParams":[],"bodyFields":[{"name":"code","required":true,"type":"string"},{"name":"state","required":true,"type":"string"}],"summary":"Complete Stripe connect from an OAuth authorization code"},{"method":"POST","path":"/api/v1/connectors/stripe/finalize","pathParams":[],"queryParams":[],"bodyFields":[{"name":"accountId","required":true,"type":"string"},{"name":"stripeUserId","required":true,"type":"string"},{"name":"state","required":true,"type":"string"},{"name":"installSignature","required":true,"type":"string"},{"name":"livemode","required":true,"type":"boolean"},{"name":"extraFields","required":false,"type":"object"}],"summary":"Finalize Stripe one-click connect"},{"method":"POST","path":"/api/v1/stripe-app/webhooks","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Inbound Stripe App webhook (uninstall handling)"},{"method":"GET","path":"/api/v1/payment-methods","pathParams":[],"queryParams":[{"name":"customerId","required":false,"type":"string"},{"name":"cartTotal","required":false,"type":"integer"}],"bodyFields":null,"summary":"List active payment methods derived from configured connectors"},{"method":"GET","path":"/api/v1/bigcommerce/connections","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List BigCommerce connections for the calling merchant"},{"method":"POST","path":"/api/v1/bigcommerce/connect","pathParams":[],"queryParams":[],"bodyFields":[{"name":"storeHash","required":true,"type":"string"},{"name":"accessToken","required":true,"type":"string"}],"summary":"Connect a BC store via static credentials"},{"method":"POST","path":"/api/v1/bigcommerce/connections/{id}/retry","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Retry webhook registration for a setup_failed connection"},{"method":"DELETE","path":"/api/v1/bigcommerce/connections/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Disconnect a BC store (soft-delete; 90-day cron hard-deletes after retention)"},{"method":"GET","path":"/api/v1/webhook-endpoints","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List configured outbound webhook endpoints"},{"method":"POST","path":"/api/v1/webhook-endpoints","pathParams":[],"queryParams":[],"bodyFields":[{"name":"url","required":true,"type":"string"},{"name":"enabledEvents","required":true,"type":"string[]"}],"summary":"Create an outbound webhook endpoint"},{"method":"GET","path":"/api/v1/webhook-endpoints/coverage","pathParams":[],"queryParams":[{"name":"days","required":false,"type":"integer"}],"bodyFields":null,"summary":"Event types emitted recently with no active subscriber","description":"Reports subscribable event types this application emitted in the lookback window that no active webhook endpoint is subscribed to. Use it to catch handlers wired up for events that can never arrive."},{"method":"PATCH","path":"/api/v1/webhook-endpoints/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"url","required":false,"type":"string"},{"name":"enabledEvents","required":false,"type":"string[]"},{"name":"isActive","required":false,"type":"boolean"}],"summary":"Update a webhook endpoint (URL, events, or active flag)"},{"method":"DELETE","path":"/api/v1/webhook-endpoints/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Soft-delete a webhook endpoint (sets deletedAt; excludes from list and dispatch)"},{"method":"POST","path":"/api/v1/webhook-endpoints/{id}/rotate-secret","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"graceSeconds","required":false,"type":"integer"}],"summary":"Rotate the signing secret for a webhook endpoint (reveal-once).","description":"Mints a new signing secret and returns it once. For `graceSeconds` (default 86400, max 604800) every delivery carries two `v1=` digests — the outgoing secret first, the new one last — so a receiver that checks every digest never fails a delivery, and one that keeps only the last digest verifies from the moment it holds the new secret. `graceSeconds: 0` revokes the old secret immediately."},{"method":"GET","path":"/api/v1/webhook-deliveries","pathParams":[],"queryParams":[{"name":"endpointId","required":false,"type":"string"},{"name":"orderId","required":false,"type":"string"},{"name":"status","required":false,"type":"string","enum":["pending","delivered","failed","dead_letter"]},{"name":"eventType","required":false,"type":"string"},{"name":"limit","required":false,"type":"integer"},{"name":"offset","required":false,"type":"integer"}],"bodyFields":null,"summary":"Recent webhook delivery attempts (debug / audit log). Paginated via limit + offset."},{"method":"GET","path":"/api/v1/webhook-deliveries/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Fetch a single webhook delivery (full envelope + signature scheme) for debugging."},{"method":"POST","path":"/api/v1/webhook-endpoints/{id}/test","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"eventType","required":false,"type":"string","enum":["cart.created","cart.updated","cart.item_added","cart.item_updated","cart.item_removed","cart.shipping_selected","cart.shipping_cleared","cart.discount_applied","cart.discount_removed","cart.tax_recomputed","cart.checkout_started","cart.converted","cart.abandoned","cart.merged","order.created","order.updated","order.fulfilled","order.cancelled","order.closed","order.comped","order.comp_reversed","order.held","order.hold_released","order.sync_failed","order.sync_conflict","return.created","return.updated","quote.requested","quote.proposed","quote.viewed","quote.comment_added","quote.revision_requested","quote.declined","quote.accepted","quote.converted","quote.expired","payment.pending","payment.authorized","payment.processing","payment.captured","payment.failed","payment.voided","payment.expired","payment.recorded","payment.refunded","payment.partially_refunded","payment.refund_failed","payment.vaulted","payment.disputed","payment.dispute_cleared","fulfillment.created","fulfillment.completed","fulfillment.cancelled","fulfillment.shipment.shipped","fulfillment.shipment.delivered","fulfillment.digital.delivered","subscription.created","subscription.activated","subscription.updated","subscription.plan_changed","subscription.plan_change_scheduled","subscription.paused","subscription.resumed","subscription.cancelled","subscription.completed","subscription.invoice_refunded","subscription.renewed","subscription.past_due","subscription.payment_failed","subscription.backup_pm_used","subscription.create_failed","subscription.trial_blocked","discount.applied","discount.removed","customer.created","customer.updated","customer.deleted","customer.payment_method_added","customer.payment_method_removed","customer.registered","customer.email_verified","customer.password_changed","customer.sessions_revoked","invoice.past_due","import.completed","script.loaded","script.blocked","script.error","shipping_tax.provider_connection.unhealthy","workspace.payment_method.added","workspace.payment_method.removed","workspace.payment_method.default_changed","workspace.payment_method.backup_set","workspace.payment_method.backup_used","workspace.platform_charge.succeeded","workspace.platform_charge.failed","workspace.trial_expired","extension.uninstalled","extension.webhook_secret_rotated"]},{"name":"data","required":false,"type":"object"}],"summary":"Send a synthetic, signed test delivery to this endpoint.","description":"Sends a synthetic, signed delivery of one event type. The endpoint must be subscribed to that type (an endpoint subscribed to all events accepts any type); otherwise the call fails with 400 validation_error naming the allowed types."},{"method":"POST","path":"/api/v1/webhook-deliveries/{id}/replay","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Replay a delivery (re-fires same payload with new signature)."},{"method":"POST","path":"/api/v1/merchants/me/external-cart-ack","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Mark this merchant as a non-BC (\"external cart\") merchant so onboarding can complete."},{"method":"POST","path":"/api/v1/merchants/me/finish-onboarding","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Mark the merchant as having finished the onboarding wizard."},{"method":"PATCH","path":"/api/v1/merchants/me/settings/net30","pathParams":[],"queryParams":[],"bodyFields":[{"name":"enabled","required":false,"type":"boolean"},{"name":"invoicePrefix","required":false,"type":"string"},{"name":"defaultNetDays","required":false,"type":"integer"},{"name":"termsText","required":false,"type":"string|null"}],"summary":"Update Net30 invoice billing settings."},{"method":"POST","path":"/api/v1/merchants/me/logo","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Upload a merchant logo (multipart/form-data, field: logo)."},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}/logo","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":null,"summary":"Upload an application logo."},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}/logo","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":null,"summary":"Delete an application logo."},{"method":"POST","path":"/api/v1/email/asset-upload","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Upload an image asset for inline use in an email template (multipart, field: file)."},{"method":"POST","path":"/api/v1/extensions/icon-upload","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Upload an extension icon (multipart/form-data, field: file).","description":"Accepts PNG, JPEG, WebP or SVG up to 2 MB and returns the public `iconUrl` to set on the extension. Any credential holding `extensions:write` may call it: a secret API key or a dashboard session."},{"method":"POST","path":"/api/v1/extensions/screenshot-upload","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Upload a marketplace listing screenshot (multipart/form-data, field: file).","description":"Accepts PNG, JPEG or WebP up to 5 MB and returns the public `screenshotUrl` to include in the listing `screenshots` array. Any credential holding `extensions:write` may call it: a secret API key or a dashboard session."},{"method":"GET","path":"/api/v1/assets/{*}","pathParams":["*"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/imports","pathParams":[],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"cursor","required":false,"type":"string"}],"bodyFields":null,"summary":"Imports for this application and environment, newest first."},{"method":"POST","path":"/api/v1/imports","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Start a bulk import: creates the import record and returns a presigned PUT the browser uploads the file to directly."},{"method":"POST","path":"/api/v1/imports/{id}/inspect","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Sniff the uploaded file: dialect, headers, a 20-row sample, the matched template and a suggested target field per header."},{"method":"PATCH","path":"/api/v1/imports/{id}/mapping","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Save the column-to-field mapping the merchant confirmed on the mapping screen."},{"method":"POST","path":"/api/v1/imports/{id}/validate","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Queue a dry run: reads the whole file under the saved mapping, reports what it would create, update, skip and reject, and writes nothing."},{"method":"POST","path":"/api/v1/imports/{id}/commit","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Queue the real import. Requires a completed dry run: an import that has not been validated is refused."},{"method":"POST","path":"/api/v1/imports/{id}/undo","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Queue the deletion of the rows this import created. Rows it only matched, and rows another record now depends on, are kept and reported on the import row."},{"method":"GET","path":"/api/v1/imports/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"One import, with its counters and derived progress."},{"method":"GET","path":"/api/v1/imports/{id}/errors","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"The row-level error report for an import, as a re-importable CSV plus the rows behind it. 404 when the import recorded no failures."},{"method":"GET","path":"/api/v1/audit-log","pathParams":[],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"environmentId","required":false,"type":"string"}],"bodyFields":null,"summary":"Recent admin actions taken on this merchant"},{"method":"POST","path":"/api/v1/fulfillments/{id}/digital/upload","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/fulfillments/{id}/digital/download","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/payments/{id}/invoice/download","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/net30/connection","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the calling merchant's Net30 connection"},{"method":"POST","path":"/api/v1/net30/connection","pathParams":[],"queryParams":[],"bodyFields":[{"name":"invoicePrefix","required":true,"type":"string"},{"name":"defaultNetDays","required":true,"type":"integer"},{"name":"termsText","required":false,"type":"string|null"},{"name":"maxOrderTotal","required":false,"type":"number|null"},{"name":"enabled","required":true,"type":"boolean"}],"summary":"Create the calling merchant's Net30 connection"},{"method":"PATCH","path":"/api/v1/net30/connection/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"invoicePrefix","required":false,"type":"string"},{"name":"defaultNetDays","required":false,"type":"integer"},{"name":"termsText","required":false,"type":"string|null"},{"name":"maxOrderTotal","required":false,"type":"number|null"},{"name":"enabled","required":false,"type":"boolean"}],"summary":"Update the calling merchant's Net30 connection"},{"method":"DELETE","path":"/api/v1/net30/connection/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Soft-delete (disable) the calling merchant's Net30 connection"},{"method":"GET","path":"/api/v1/net30/eligible-customers","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List the calling merchant's Net30 eligible customers"},{"method":"POST","path":"/api/v1/net30/eligible-customers","pathParams":[],"queryParams":[],"bodyFields":[{"name":"customerId","required":true,"type":"string"},{"name":"notes","required":false,"type":"string"}],"summary":"Add a customer to the Net30 eligible allowlist"},{"method":"DELETE","path":"/api/v1/net30/eligible-customers/{customerId}","pathParams":["customerId"],"queryParams":[],"bodyFields":null,"summary":"Remove a customer from the Net30 eligible allowlist"},{"method":"PATCH","path":"/api/v1/payments/{id}/notes","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"notes","required":true,"type":"string|null"}],"summary":"Update free-text notes on a payment (5000 char max)."},{"method":"POST","path":"/api/v1/payments/{id}/dispute","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string"}],"summary":"Open a dispute on a Net30 payment."},{"method":"POST","path":"/api/v1/payments/{id}/dispute/clear","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Clear an open dispute on a payment (leaves reason + opened_at for audit)."},{"method":"POST","path":"/api/v1/payments/{id}/backdate-due-date","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"daysPastDue","required":true,"type":"integer"}],"summary":"Backdate metadata.dueDate so a Net-N invoice falls into a specific aging bucket. Demo/test tool only."},{"method":"GET","path":"/api/v1/invoices/aging","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"AR aging report: outstanding Net30 payments bucketed by days past due."},{"method":"GET","path":"/api/v1/analytics/orders-timeseries","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"compareTo","required":false,"type":"string","enum":["previous_period","previous_year","none"]}],"bodyFields":null,"summary":"Order count + captured gross revenue over a date range, bucketed by day/week/month in a requested timezone (default trailing 30 days, UTC, daily)."},{"method":"GET","path":"/api/v1/analytics/business-summary","pathParams":[],"queryParams":[{"name":"period","required":false,"type":"string"},{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]}],"bodyFields":null,"summary":"Business summary: orders/revenue, subscription MRR, receivables, quotes — week/month/quarter, compared to the prior period of equal length."},{"method":"GET","path":"/api/v1/analytics/attention-digest","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Point-in-time digest: open disputes, subscriptions in dunning, overdue invoices, and webhooks with degraded delivery health."},{"method":"GET","path":"/api/v1/analytics/products","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"by","required":false,"type":"string","description":"Sort key: revenue or units. Defaults to revenue."},{"name":"limit","required":false,"type":"integer","description":"Max rows to return. Defaults to 20."}],"bodyFields":null,"summary":"Best-selling products over a date range, by revenue or units sold. Product identity is the external reference id when the merchant sent one, the line item name otherwise."},{"method":"GET","path":"/api/v1/analytics/customers","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"topBy","required":false,"type":"string","description":"Sort key for top customers: revenue or orders. Defaults to revenue."},{"name":"topLimit","required":false,"type":"integer","description":"Max top-customers rows to return. Defaults to 10."}],"bodyFields":null,"summary":"Customer growth over a date range: signups per day/week/month, new-vs-returning order split, and the highest-value customers in the window."},{"method":"GET","path":"/api/v1/analytics/revenue-breakdown","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"dimension","required":false,"type":"string","description":"Required. Breakdown dimension: paymentMethod, source, or currency."}],"bodyFields":null,"summary":"Revenue split by one dimension over a date range — payment method, order source, or currency. Amounts are gross; refunds are not deducted."},{"method":"GET","path":"/api/v1/analytics/funnel","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]}],"bodyFields":null,"summary":"Checkout funnel over a date range: carts created, checkout sessions started, orders completed, with the drop-off between each stage."},{"method":"GET","path":"/api/v1/analytics/subscriptions","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]}],"bodyFields":null,"summary":"Subscription movement over a date range: new subscriptions, cancellations, and net MRR change per bucket (day/week/month)."},{"method":"GET","path":"/api/v1/analytics/discounts","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"limit","required":false,"type":"integer","description":"Max rows to return. Defaults to 20."}],"bodyFields":null,"summary":"Discount code performance over a date range: redemption count, revenue on discounted orders, and total discount given per code."},{"method":"GET","path":"/api/v1/orders/{id}/returns","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"List an order's returns."},{"method":"POST","path":"/api/v1/orders/{id}/returns","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"items","required":true,"type":"object[]"},{"name":"reason","required":false,"type":"string"},{"name":"restock","required":false,"type":"boolean"}],"summary":"Open a return (RMA) against an order for a subset of its line items."},{"method":"GET","path":"/api/v1/returns/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get a return and its items."},{"method":"POST","path":"/api/v1/returns/{id}/transition","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"action","required":true,"type":"string","enum":["approve","reject","receive","complete","cancel"]}],"summary":"Transition a return: approve | reject | receive | complete | cancel."},{"method":"POST","path":"/api/v1/returns/{id}/exchange","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"items","required":true,"type":"object[]"}],"summary":"Complete a return as an exchange: create a replacement order for the swapped items and settle the price difference (charge if more, refund if less)."},{"method":"PATCH","path":"/api/v1/orders/{id}/line-items","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"add","required":false,"type":"object[]"},{"name":"update","required":false,"type":"object[]"},{"name":"remove","required":false,"type":"string[]"}],"summary":"Add, update, or remove line items on an order. On a captured order the total delta is charged (increase) or refunded (decrease) automatically."},{"method":"GET","path":"/api/v1/embed-config","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the merchant embed config (allowlisted parent origins + branding)"},{"method":"PUT","path":"/api/v1/embed-config","pathParams":[],"queryParams":[],"bodyFields":[{"name":"allowedOrigins","required":false,"type":"string[]"},{"name":"primaryColor","required":false,"type":"string"},{"name":"logoUrl","required":false,"type":"string"},{"name":"merchantName","required":false,"type":"string"},{"name":"storefrontBaseUrl","required":false,"type":"string|null","description":"Absolute base URL of your storefront (e.g. \"https://yourstore.com\"). Relative line-item imageUrls are resolved against it. Pass null to clear; when unset, the first allowedOrigin is used."},{"name":"verifyPath","required":false,"type":"string|null","description":"Path on your storefront that handles email-verification links, e.g. \"/auth/confirm\". Defaults to \"/account/verify\" (where the SDK component ships). Pass null to clear."},{"name":"resetPath","required":false,"type":"string|null","description":"Path on your storefront that handles password-reset links, e.g. \"/auth/new-password\". Defaults to \"/account/reset\". Pass null to clear."},{"name":"cartRecoveryUrlTemplate","required":false,"type":"string|null","description":"Absolute https URL template used to build the recovery link in abandoned-cart emails. Must contain a \"{cartId}\" placeholder, e.g. \"https://yourstore.com/cart?c={cartId}\". Pass null to clear; when unset, abandoned carts are recovered via the cart.abandoned webhook only (no recovery email)."},{"name":"cartAbandonmentThresholdMinutes","required":false,"type":"integer|null","description":"Minutes of inactivity before an open/checkout cart is treated as abandoned by the sweep. Range 15–129600 (90 days). Pass null to clear; when unset, the platform default of 1440 (24h) applies."},{"name":"checkoutLinkBaseUrl","required":false,"type":"string|null","description":"Absolute https URL your buyers land on for quote links and cart recovery links, e.g. \"https://yourstore.com\". Throttle appends its own path (\"/q/{shareToken}\", \"/r/{cartSessionToken}\"), so host those routes with the Throttle SDKs. Pass null to clear; when unset, links point at Throttle-hosted checkout."}],"summary":"Update the merchant embed config"},{"method":"GET","path":"/api/v1/tracking-settings","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get per-environment analytics tracking settings (secrets masked)"},{"method":"PUT","path":"/api/v1/tracking-settings","pathParams":[],"queryParams":[],"bodyFields":[{"name":"ga4MeasurementId","required":false,"type":"string|null"},{"name":"metaPixelId","required":false,"type":"string|null"},{"name":"ga4ApiSecret","required":false,"type":"string|null"},{"name":"metaCapiAccessToken","required":false,"type":"string|null"},{"name":"serverSideEnabled","required":false,"type":"boolean"},{"name":"requireConsent","required":false,"type":"boolean"}],"summary":"Update per-environment analytics tracking settings. Omitted fields are unchanged; empty string clears a field."},{"method":"GET","path":"/api/v1/application-scripts","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List this environment’s merchant-authored scripts"},{"method":"POST","path":"/api/v1/application-scripts","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Create a merchant-authored script"},{"method":"PATCH","path":"/api/v1/application-scripts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Update a merchant-authored script"},{"method":"DELETE","path":"/api/v1/application-scripts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Soft-delete a merchant-authored script"},{"method":"PUT","path":"/api/v1/application-scripts/kill-switch","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Disable or re-enable every script in this environment"},{"method":"GET","path":"/api/v1/application-scripts/app-inventory","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Every marketplace-app script active in this environment (read-only)"},{"method":"GET","path":"/api/v1/application-scripts/installs/{installId}","pathParams":["installId"],"queryParams":[],"bodyFields":null,"summary":"One installed app's scripts, with the merchant's per-install controls"},{"method":"GET","path":"/api/v1/application-scripts/health","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Last 24h load outcomes per script"},{"method":"GET","path":"/api/v1/storefront/scripts","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Resolve this application/environment's storefront scripts (publishable key)"},{"method":"GET","path":"/api/v1/storefront/script-frame-policy/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Origins permitted to frame a script sandbox (public)"},{"method":"GET","path":"/api/v1/storefront/script-assets/{id}/{sha256}","pathParams":["id","sha256"],"queryParams":[],"bodyFields":null,"summary":"Fetch a buyer-facing script by id and content hash (public, immutable)"},{"method":"POST","path":"/api/v1/storefront/script-events/{sessionId}","pathParams":["sessionId"],"queryParams":[],"bodyFields":null,"summary":"Record buyer-side script load outcomes for a checkout session"},{"method":"POST","path":"/api/v1/storefront/script-events","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Record buyer-side script load outcomes for a storefront or quote page"},{"method":"POST","path":"/api/v1/storefront/script-events/quote/{token}","pathParams":["token"],"queryParams":[],"bodyFields":null,"summary":"Record buyer-side script load outcomes for a hosted quote page"},{"method":"POST","path":"/v1/clerk/webhooks/user-created","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Clerk user.created webhook (Svix-verified)"},{"method":"GET","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PUT","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/oauth/token","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/resend/webhooks","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/email/templates","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List all email template definitions with merchant overrides"},{"method":"GET","path":"/api/v1/email/templates/{key}","pathParams":["key"],"queryParams":[],"bodyFields":null,"summary":"Get a single email template definition with merchant override"},{"method":"PUT","path":"/api/v1/email/templates/{key}","pathParams":["key"],"queryParams":[],"bodyFields":null,"summary":"Upsert a merchant override for an email template"},{"method":"DELETE","path":"/api/v1/email/templates/{key}","pathParams":["key"],"queryParams":[],"bodyFields":null,"summary":"Delete merchant override for an email template (reset to default)"},{"method":"POST","path":"/api/v1/email/templates/{key}/preview","pathParams":["key"],"queryParams":[],"bodyFields":null,"summary":"Render a template with sample data for preview"},{"method":"POST","path":"/api/v1/email/test-send","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Send a test email to the authenticated admin (bypasses opt-out + cooldown)"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email/templates","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"List application email template definitions with application overrides"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email/templates/{key}","pathParams":["applicationId","key"],"queryParams":[],"bodyFields":null,"summary":"Get an application email template definition with application override"},{"method":"PUT","path":"/api/v1/applications/{applicationId}/email/templates/{key}","pathParams":["applicationId","key"],"queryParams":[],"bodyFields":null,"summary":"Upsert an application override for an email template"},{"method":"DELETE","path":"/api/v1/applications/{applicationId}/email/templates/{key}","pathParams":["applicationId","key"],"queryParams":[],"bodyFields":null,"summary":"Delete application override for an email template"},{"method":"POST","path":"/api/v1/applications/{applicationId}/email/templates/{key}/preview","pathParams":["applicationId","key"],"queryParams":[],"bodyFields":null,"summary":"Render an application template with sample data for preview"},{"method":"POST","path":"/api/v1/applications/{applicationId}/email/test-send","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Send an application-scoped test email to the authenticated admin"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email/messages","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"List recent email messages for the application"},{"method":"GET","path":"/api/v1/email/messages","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List recent email messages for the merchant"},{"method":"GET","path":"/api/v1/merchants/me/email-settings","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get workspace email settings"},{"method":"PATCH","path":"/api/v1/merchants/me/email-settings","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Update workspace email settings"},{"method":"PATCH","path":"/api/v1/merchants/me/members/{id}/preferences","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Update per-member email preferences"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Get application email settings"},{"method":"PATCH","path":"/api/v1/applications/{applicationId}/email-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Update application email settings"},{"method":"GET","path":"/api/v1/applications/{applicationId}/auth-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Get buyer-auth settings for an application"},{"method":"PATCH","path":"/api/v1/applications/{applicationId}/auth-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":[{"name":"enabled","required":false,"type":"boolean"}],"summary":"Update buyer-auth settings for an application"},{"method":"GET","path":"/api/v1/applications/{applicationId}/quote-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Get quote notification settings for an application"},{"method":"PATCH","path":"/api/v1/applications/{applicationId}/quote-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":[{"name":"notificationEmails","required":true,"type":"string[]"}],"summary":"Update quote notification settings for an application"},{"method":"GET","path":"/api/v1/customers/auth-summary","pathParams":[],"queryParams":[{"name":"ids","required":true,"type":"string"}],"bodyFields":null,"summary":"Account state for a page of customers"},{"method":"GET","path":"/api/v1/customers/{customerId}/auth","pathParams":["customerId"],"queryParams":[],"bodyFields":null,"summary":"Buyer account detail for one customer"},{"method":"POST","path":"/api/v1/customers/{customerId}/auth/sign-out-all","pathParams":["customerId"],"queryParams":[],"bodyFields":null,"summary":"Revoke every session for a customer"},{"method":"GET","path":"/api/v1/email/sender-domain","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the current custom sending domain state"},{"method":"POST","path":"/api/v1/email/sender-domain","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Register a custom sending domain via Resend"},{"method":"DELETE","path":"/api/v1/email/sender-domain","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Disconnect and remove the custom sending domain"},{"method":"POST","path":"/api/v1/email/sender-domain/verify","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Trigger a domain verification check via Resend"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email/sender-domain","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Get the current application custom sending domain state"},{"method":"POST","path":"/api/v1/applications/{applicationId}/email/sender-domain","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Register an application custom sending domain via Resend"},{"method":"DELETE","path":"/api/v1/applications/{applicationId}/email/sender-domain","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Disconnect and remove the application custom sending domain"},{"method":"POST","path":"/api/v1/applications/{applicationId}/email/sender-domain/verify","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Trigger an application domain verification check via Resend"},{"method":"GET","path":"/api/v1/merchants/me/invites","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"[legacy] List merchant team members"},{"method":"POST","path":"/api/v1/merchants/me/invites","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"[legacy] Invite a team member (delegates to team-service)"},{"method":"POST","path":"/api/v1/merchants/me/invites/{id}/resend","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"[legacy] Resend an invite"},{"method":"POST","path":"/api/v1/merchants/me/invites/{id}/revoke","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"[legacy] Revoke an invite or remove a member"},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/invites","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/invites","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null,"summary":"Create a team invite"},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/invites/{id}/resend","pathParams":["workspaceId","id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/invites/{id}/revoke","pathParams":["workspaceId","id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/invites/accept","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/invites/pending","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/members","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/members/me","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/workspaces/{workspaceId}/members/{memberId}","pathParams":["workspaceId","memberId"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/members/{memberId}","pathParams":["workspaceId","memberId"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/members/{memberId}/applications/{applicationId}","pathParams":["workspaceId","memberId","applicationId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/auth/permissions","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/notifications/unread-count","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/notifications","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/notifications/{id}/read","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/notifications/{id}/unread","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/notifications/{id}/archive","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/notifications/read-all","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/me/preferences","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/me/preferences","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{wsId}/support/tickets","pathParams":["wsId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/tickets","pathParams":["wsId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{wsId}/support/tickets/{id}","pathParams":["wsId","id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/tickets/{id}/comments","pathParams":["wsId","id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/tickets/{id}/read","pathParams":["wsId","id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{wsId}/support/unread-count","pathParams":["wsId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/attachments/presign","pathParams":["wsId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/attachments/{attachmentId}/confirm","pathParams":["wsId","attachmentId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/support/dispatch-webhook","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List workspaces the authenticated user is a member of"},{"method":"POST","path":"/api/v1/workspaces","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string","description":"URL-safe identifier, globally unique"},{"name":"email","required":false,"type":"string","description":"Owner email (used for member row); falls back to empty string if omitted"}],"description":"Create a new workspace; the calling user becomes owner"},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null,"description":"Get a single workspace by ID (must be a member)"},{"method":"PATCH","path":"/api/v1/workspaces/{workspaceId}","pathParams":["workspaceId"],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"slug","required":false,"type":"string"}],"description":"Update workspace name or slug (must be a member)"},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}","pathParams":["workspaceId"],"queryParams":[{"name":"force","required":false,"type":"string","enum":["true","false"]}],"bodyFields":null,"description":"Delete a workspace (must be a member; pass ?force=true to cascade-delete applications)"},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/environments","pathParams":["workspaceId"],"queryParams":[{"name":"includeArchived","required":false,"type":"string","enum":["true","false"]}],"bodyFields":null,"description":"List workspace environments"},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/environments","pathParams":["workspaceId"],"queryParams":[],"bodyFields":[{"name":"slug","required":true,"type":"string"},{"name":"name","required":true,"type":"string"}],"description":"Create a custom non-production sandbox environment"},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/environments/{environmentId}","pathParams":["workspaceId","environmentId"],"queryParams":[],"bodyFields":null,"description":"Archive a custom workspace environment"},{"method":"POST","path":"/api/v1/workspaces/{id}/go-live","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"acceptedProductionTermsAt","required":true,"type":"string"}],"summary":"Flip a sandbox workspace to production. Multi-precondition gated."},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/applications","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null,"description":"List applications in a workspace (must be a member)"},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/applications","pathParams":["workspaceId"],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string","description":"URL-safe identifier, unique within the workspace"},{"name":"currency","required":false,"type":"string"},{"name":"displayName","required":false,"type":"string|null"},{"name":"brandColor","required":false,"type":"string|null"},{"name":"allowedOrigins","required":false,"type":"string[]"}],"description":"Create a new application in a workspace (must be a member)"},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":null,"description":"Get a single application by ID (must be a workspace member)"},{"method":"PATCH","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"slug","required":false,"type":"string"},{"name":"currency","required":false,"type":"string"},{"name":"isActive","required":false,"type":"boolean"},{"name":"displayName","required":false,"type":"string|null"},{"name":"brandColor","required":false,"type":"string|null"},{"name":"allowedOrigins","required":false,"type":"string[]"},{"name":"timezone","required":false,"type":"string|null","description":"IANA timezone name (e.g. \"America/Los_Angeles\"). null resets to UTC. Applies to rendered surfaces only — API timestamps stay ISO 8601 UTC."},{"name":"quoteNumberPrefix","required":false,"type":"string"},{"name":"nextQuoteSeq","required":false,"type":"integer"},{"name":"orderNumberPrefix","required":false,"type":"string"},{"name":"nextOrderSeq","required":false,"type":"integer"}],"description":"Update application identity, branding, timezone, or document numbering (must be a workspace member). Timezone and numbering are per workspace environment."},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":null,"description":"Delete an application (must be a workspace member)"},{"method":"GET","path":"/api/v1/billing/state","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/billing/subscribe","pathParams":[],"queryParams":[],"bodyFields":[{"name":"paymentMethodToken","required":false,"type":"string"}]},{"method":"POST","path":"/api/v1/billing/cancel","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/billing/resume","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/payment-methods","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/billing/payment-methods","pathParams":[],"queryParams":[],"bodyFields":[{"name":"paymentMethodToken","required":true,"type":"string"},{"name":"verificationTransactionId","required":false,"type":"string"}]},{"method":"PATCH","path":"/api/v1/billing/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"role","required":true,"type":"string","enum":["primary","backup"]}]},{"method":"DELETE","path":"/api/v1/billing/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/billing/gr4vy-embed-token","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/provider-status","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/invoices","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/invoices/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/invoices/{id}/receipt.pdf","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/plan-history","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/overview","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/platform-revenue","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/platform-billing/run-renewal","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/platform-billing/run-dunning","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/extend-trial","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/promote-partner","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/partner-applications","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/partner-applications/{id}/reject","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/demote-partner","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/force-tier-override","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/refund-charge","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/cancel-immediately","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/bring-legacy-into-billing","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/suspend","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/reactivate","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/audit-log","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/me/staff-status","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/staff","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/staff","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/admin/staff/{email}","pathParams":["email"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/payment-methods","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/invoices","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/usage","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/subscription-timeline","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/members","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/admin/workspaces/{id}/members/{memberId}","pathParams":["id","memberId"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/admin/workspaces/{id}/members/{memberId}","pathParams":["id","memberId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/extensions/reviews","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/extensions/reviews/{sid}","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/claim","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/comments","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/install-candidate","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/uninstall-candidate","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/approve","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/request-changes","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/reject","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/{id}/unpublish","pathParams":["id"],"queryParams":[],"bodyFields":null}]}
1
+ {"generatedAt":"2026-10-27T06:26:00.020Z","operations":[{"method":"GET","path":"/health","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/ready","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/internal/sentry-smoke","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/unsubscribe","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/unsubscribe/apply","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/organizations","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List organizations"},{"method":"POST","path":"/api/v1/organizations","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string"},{"name":"settings","required":false,"type":"object"}],"description":"Create an organization"},{"method":"GET","path":"/api/v1/organizations/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get organization by ID"},{"method":"PATCH","path":"/api/v1/organizations/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Update an organization"},{"method":"GET","path":"/api/v1/stores","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List all stores for the organization"},{"method":"POST","path":"/api/v1/stores","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string","description":"URL-safe identifier, unique per organization"},{"name":"currency","required":false,"type":"string","description":"ISO 4217 currency code"},{"name":"settings","required":false,"type":"object"}],"description":"Create a new store under the organization"},{"method":"GET","path":"/api/v1/stores/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a store by ID"},{"method":"PATCH","path":"/api/v1/stores/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"currency","required":false,"type":"string","description":"ISO 4217 currency code"},{"name":"settings","required":false,"type":"object"},{"name":"isActive","required":false,"type":"boolean","description":"Deactivate a store without deleting it"}],"description":"Update a store (name, currency, settings, active status)"},{"method":"GET","path":"/api/v1/customers","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"applicationId","required":false,"type":"string"},{"name":"email","required":false,"type":"string"},{"name":"identity","required":false,"type":"string","enum":["linked","unlinked"]},{"name":"q","required":false,"type":"string","description":"Search email, name, phone, external ids, or metadata."},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List customers with cursor pagination"},{"method":"POST","path":"/api/v1/customers","pathParams":[],"queryParams":[],"bodyFields":[{"name":"applicationId","required":false,"type":"string"},{"name":"email","required":true,"type":"string"},{"name":"externalId","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"acceptsMarketing","required":false,"type":"boolean"},{"name":"netN","required":false,"type":"integer"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Create a new customer"},{"method":"GET","path":"/api/v1/customers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a customer by ID"},{"method":"PATCH","path":"/api/v1/customers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"email","required":false,"type":"string"},{"name":"externalId","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"acceptsMarketing","required":false,"type":"boolean"},{"name":"netN","required":false,"type":"integer"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a customer"},{"method":"DELETE","path":"/api/v1/customers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Delete a customer"},{"method":"GET","path":"/api/v1/customers/by-external/{externalId}","pathParams":["externalId"],"queryParams":[],"bodyFields":null,"description":"Look up a customer by the merchant's own externalId (set when the customer was created). Useful for merchant backends that key their user table off their own IDs and don't store the throttle customerId."},{"method":"POST","path":"/api/v1/customers/{id}/anonymize","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Anonymize a customer (soft GDPR delete): tombstone the customer + address PII in place while keeping order/payment/subscription history. Irreversible."},{"method":"GET","path":"/api/v1/customers/{id}/addresses","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List addresses for a customer"},{"method":"POST","path":"/api/v1/customers/{id}/addresses","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"label","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string","description":"Optional. Business name for B2B addresses."},{"name":"addressLine1","required":true,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":true,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":true,"type":"string","description":"ISO 3166-1 alpha-2"},{"name":"phone","required":false,"type":"string"},{"name":"isDefault","required":false,"type":"boolean"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Add an address to a customer"},{"method":"PATCH","path":"/api/v1/customers/{customerId}/addresses/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":[{"name":"label","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string","description":"Optional. Business name for B2B addresses."},{"name":"addressLine1","required":false,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":false,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":false,"type":"string","description":"ISO 3166-1 alpha-2"},{"name":"phone","required":false,"type":"string"},{"name":"isDefault","required":false,"type":"boolean"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a customer address"},{"method":"DELETE","path":"/api/v1/customers/{customerId}/addresses/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Delete a customer address"},{"method":"GET","path":"/api/v1/customers/{id}/payment-methods","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List payment methods for a customer"},{"method":"POST","path":"/api/v1/customers/{id}/payment-methods","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"processor","required":true,"type":"string"},{"name":"processorToken","required":true,"type":"string"},{"name":"methodType","required":true,"type":"string","enum":["card","bank_account","wallet"]},{"name":"cardBrand","required":false,"type":"string"},{"name":"cardLastFour","required":false,"type":"string"},{"name":"cardExpMonth","required":false,"type":"integer"},{"name":"cardExpYear","required":false,"type":"integer"},{"name":"isDefault","required":false,"type":"boolean"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Add a payment method to a customer"},{"method":"GET","path":"/api/v1/customers/{customerId}/payment-methods/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Get a customer payment method"},{"method":"PATCH","path":"/api/v1/customers/{customerId}/payment-methods/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":[{"name":"isDefault","required":false,"type":"boolean"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a customer payment method"},{"method":"DELETE","path":"/api/v1/customers/{customerId}/payment-methods/{id}","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Delete a customer payment method"},{"method":"POST","path":"/api/v1/customers/{customerId}/payment-methods/{id}/pause","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Pause a customer payment method"},{"method":"POST","path":"/api/v1/customers/{customerId}/payment-methods/{id}/resume","pathParams":["customerId","id"],"queryParams":[],"bodyFields":null,"description":"Resume a customer payment method"},{"method":"POST","path":"/api/v1/customer-tokens/introspect","pathParams":[],"queryParams":[],"bodyFields":[{"name":"token","required":true,"type":"string"}],"description":"Check a shopper's customer access token. An invalid, expired or revoked token, or one of another application or environment, answers `active: false` and nothing else."},{"method":"GET","path":"/api/v1/customer-directory","pathParams":[],"queryParams":[{"name":"q","required":false,"type":"string","description":"Name or email prefix, 2–100 characters."},{"name":"ids","required":false,"type":"string","description":"Up to 50 comma-separated customer ids."},{"name":"limit","required":false,"type":"integer","description":"With `q`: 1–20, default 10. Ignored with `ids`, which answers every id found."}],"bodyFields":null,"description":"Find customers of the calling key's application and environment, answering only id, name and email. Send exactly one of `q` (a case-insensitive prefix of the name, the last name or the email) or `ids` (up to 50 comma-separated customer ids, answered in the order given; unknown ids are skipped). A search never lists an erased (anonymized) customer. Requires `customer_directory:read`. Responses carry `Cache-Control: no-store`."},{"method":"POST","path":"/api/v1/payment-methods/client-token","pathParams":[],"queryParams":[],"bodyFields":[{"name":"customerId","required":true,"type":"string"},{"name":"subscriptionId","required":false,"type":"string"}],"summary":"Mint a customer-scoped client token for browser payment-method management"},{"method":"GET","path":"/api/v1/me/payment-methods","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List the authenticated customer's saved payment methods"},{"method":"PATCH","path":"/api/v1/me/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"isDefault","required":true,"type":"boolean","enum":["true"]}],"summary":"Set a saved payment method as default"},{"method":"DELETE","path":"/api/v1/me/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Remove a saved payment method"},{"method":"POST","path":"/api/v1/me/payment-methods/embed-token","pathParams":[],"queryParams":[],"bodyFields":[{"name":"currency","required":false,"type":"string"}],"summary":"Mint a Gr4vy add-only vault embed token scoped to the authenticated customer"},{"method":"POST","path":"/api/v1/me/payment-methods/confirm","pathParams":[],"queryParams":[],"bodyFields":[{"name":"transactionId","required":true,"type":"string"}],"summary":"Record a card vaulted via the add-card embed"},{"method":"GET","path":"/api/v1/me/subscriptions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"One of the authenticated customer's subscriptions, with the card that renews it"},{"method":"POST","path":"/api/v1/me/subscriptions/{id}/retry-charge","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Charge a past-due subscription now, against the card it renews on"},{"method":"PATCH","path":"/api/v1/me/subscriptions/{id}/payment-method","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentMethodId","required":true,"type":"string"}],"summary":"Set the card this subscription renews on (the customer's default card stays as it is)"},{"method":"POST","path":"/api/v1/carts","pathParams":[],"queryParams":[],"bodyFields":[{"name":"applicationId","required":false,"type":"string"},{"name":"customerId","required":false,"type":"string"},{"name":"customerEmail","required":false,"type":"string"},{"name":"currency","required":false,"type":"string"},{"name":"netN","required":false,"type":"integer"},{"name":"buyerVatNumber","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"},{"name":"lineResolver","required":false,"type":"object","description":"Makes this a resolved cart: the installed app (extension) prices its resolved lines through its line resolver. Requires `currency`: the environment's currency or one of its extra cart currencies (`cartCurrencies`), otherwise `422 currency_not_enabled`. An app that is not installed and active answers `422 line_resolver_not_available`."},{"name":"locale","required":false,"type":"string","description":"Buyer locale (for example `en-GB`) sent to the line resolver."},{"name":"lineItems","required":false,"type":"object[]","description":"Resolved lines to add at create, priced in one resolver call; all or nothing. Requires `lineResolver`. Each `referenceId` at most once."}],"description":"Create a new cart"},{"method":"GET","path":"/api/v1/carts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a cart by ID (includes line items)"},{"method":"PATCH","path":"/api/v1/carts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"customerId","required":false,"type":"string"},{"name":"customerEmail","required":false,"type":"string"},{"name":"billingAddress","required":false,"type":"object"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"notes","required":false,"type":"string"},{"name":"netN","required":false,"type":"integer"},{"name":"buyerVatNumber","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a cart"},{"method":"POST","path":"/api/v1/carts/{id}/items","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"type","required":false,"type":"string","enum":["product","subscription","service","ticket","donation","custom"]},{"name":"referenceId","required":false,"type":"string"},{"name":"name","required":false,"type":"string"},{"name":"description","required":false,"type":"string"},{"name":"unitPrice","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"quantity","required":false,"type":"integer"},{"name":"taxAmount","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"discountAmount","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"imageUrl","required":false,"type":"string","description":"Product image. Accepts an absolute http(s) URL or a relative path (e.g. \"/images/x.png\"); relative paths are resolved against the application storefront base URL (PUT /v1/embed-config { storefrontBaseUrl }, falling back to the first allowedOrigin)."},{"name":"requiresShipping","required":false,"type":"boolean","description":"Whether this item is physically shippable. For external/ad-hoc catalogs with no Throttle product behind the item. Omit to infer from `type` (everything except `service` ships); set explicitly to force-include or force-exclude the item from `calculated` shipping."},{"name":"deliveryMethod","required":false,"type":"string","description":"What this item needs before it counts as delivered. Omit to resolve from `type` and `metadata`. `digital` and `access_grant` are delivered automatically on payment capture; `none` means there is nothing to deliver.","enum":["shipment","digital","access_grant","service","in_person","custom","none"]},{"name":"recurring","required":false,"type":"object","description":"Makes this line a subscription (type is forced to `subscription`). One subscription is created per line when the checkout completes; at most 10 per cart. Send `interval`, or `intervalUnit` + `intervalCount` (1 hour to 1 year). `totalPayments` (2-60) makes it an installment plan; `trialDays` (0-365) adds a free trial and cannot be combined with `totalPayments`. `unitPrice` is the renewal price and "},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Add a line item to a cart. Two shapes: a priced line (`name` and `unitPrice` required), accepted on every cart; or, on a cart created with `lineResolver`, `{ referenceId, quantity?, metadata? }`, which the app prices through its line resolver (`name`, price and image come from its answer)."},{"method":"PATCH","path":"/api/v1/carts/{cartId}/items/{id}","pathParams":["cartId","id"],"queryParams":[],"bodyFields":[{"name":"quantity","required":false,"type":"integer"},{"name":"unitPrice","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"taxAmount","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"discountAmount","required":false,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a line item"},{"method":"DELETE","path":"/api/v1/carts/{cartId}/items/{id}","pathParams":["cartId","id"],"queryParams":[],"bodyFields":null,"description":"Remove a line item from a cart"},{"method":"POST","path":"/api/v1/carts/{id}/checkout","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Convert the cart to a draft order. Legacy alias for /finalize — same handler, identical semantics. New integrations should call /finalize instead."},{"method":"POST","path":"/api/v1/carts/{id}/finalize","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Finalize a cart by converting it to a draft order (status=draft). To collect payment, mint a checkout session against the resulting order afterwards."},{"method":"POST","path":"/api/v1/carts/{id}/merge","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/carts/{id}/sessions","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Open Throttle's hosted cart page for a cart: returns a cart session (`cart_…`) and its `cartUrl`. Reuses the cart's active session when it has at least 24 hours left and carries the same return URLs (200); otherwise mints one valid for 7 days (201). The cart must be open: an abandoned, checkout, converted or expired cart answers 409 `cart_not_open`. The optional JSON body `{ returnUrl?, cancelUrl?, storefrontUrl? }` (no other keys) stores the store's URLs on the session, where the hosted cart page uses them for the post-payment redirect, the cancel link and \"Continue shopping\"; each must be an"},{"method":"POST","path":"/api/v1/carts/{id}/apply-discount","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"code","required":true,"type":"string"}],"description":"Apply a discount code to a cart"},{"method":"DELETE","path":"/api/v1/carts/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Remove discount code from a cart"},{"method":"POST","path":"/api/v1/carts/{id}/shipping","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"methodId","required":true,"type":"string"},{"name":"displayName","required":true,"type":"string"},{"name":"rateAmount","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"currency","required":false,"type":"string"},{"name":"carrier","required":false,"type":"string"},{"name":"serviceCode","required":false,"type":"string"},{"name":"estimatedDeliveryDays","required":false,"type":"integer"}],"description":"Select a shipping method for a cart"},{"method":"DELETE","path":"/api/v1/carts/{id}/shipping","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Clear the selected shipping method from a cart"},{"method":"PUT","path":"/api/v1/carts/{id}/tax-lines","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"lines","required":true,"type":"object[]"}],"description":"Replace all tax lines on a cart"},{"method":"DELETE","path":"/api/v1/carts/{id}/tax-lines","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Clear all tax lines from a cart"},{"method":"GET","path":"/api/v1/carts/{id}/events","pathParams":["id"],"queryParams":[{"name":"sinceSequence","required":false,"type":"integer"},{"name":"limit","required":false,"type":"integer"}],"bodyFields":null,"description":"List audit events for a cart"},{"method":"GET","path":"/api/v1/abandoned-carts","pathParams":[],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"cursor","required":false,"type":"string"}],"bodyFields":null,"summary":"List abandoned carts (most-recently abandoned first)."},{"method":"GET","path":"/api/v1/abandoned-carts/summary","pathParams":[],"queryParams":[{"name":"sinceDays","required":false,"type":"integer"}],"bodyFields":null,"summary":"Abandoned-cart summary metrics over a trailing window."},{"method":"POST","path":"/api/v1/cart-sessions","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/cart-sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/cart-sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/cart-sessions/{id}/summary","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/items","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/cart-sessions/{id}/items/{itemId}","pathParams":["id","itemId"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/cart-sessions/{id}/items/{itemId}","pathParams":["id","itemId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/shipping","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/cart-sessions/{id}/shipping","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/cart-sessions/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/refresh","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/cart-sessions/{id}/checkout-session","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/config","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/quote-tokens","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/quote-tokens","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/shipping-tax/quote-tokens/{tokenId}","pathParams":["tokenId"],"queryParams":[],"bodyFields":null},{"method":"PUT","path":"/api/v1/shipping-tax/config/draft","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/config/publish","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/quotes","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/carts/{cartId}/calculate","pathParams":["cartId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/external-snapshots","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/shipping-providers/available","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/tax-providers/available","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/shipping-providers","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/shipping-providers","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/capabilities","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/tax-providers","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers/companies","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers/referral-click","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/shipping-providers/{id}/verify","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers/{id}/verify","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/shipping-providers/{id}/primary","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/tax-providers/{id}/primary","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/shipping-tax/shipping-providers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/shipping-tax/shipping-providers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/shipping-tax/tax-providers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/shipping-tax/tax-providers/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/carrier-oauth/ups/start","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/carrier-oauth/ups/complete","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/documents","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/entity-use-codes","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/tax-codes","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/locations","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/validate-address","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/documents/customs","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/shipping-tax/documents/{id}/retry","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/tax-classifications","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/tax-classifications","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/tax-classifications/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/tax-classifications/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/ecm/test-connection","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/customers/{id}/exemption-certificates","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/customers/{id}/exemption-certificates/{certificateId}/download","pathParams":["id","certificateId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/customers/{id}/exemption-certificates/request","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/customers/{id}/exemption-certificates/{certificateId}","pathParams":["id","certificateId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/ecm/exempt-reasons","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/ecm/exposure-zones","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/provider-calls","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/provider-calls/stats","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/shipping-tax/provider-calls/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/orders","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","enum":["draft","pending","processing","partially_fulfilled","fulfilled","cancelled","closed"]},{"name":"paymentStatus","required":false,"type":"string","enum":["pending","authorized","captured","partially_paid","partially_refunded","refunded","failed","voided","processing","disputed","expired","charged_back"]},{"name":"type","required":false,"type":"string","enum":["one_time","recurring","mixed"]},{"name":"delivery","required":false,"type":"string","description":"Where the goods are. Derived from shipment and return records, not an order column: `not_shipped` = nothing has left yet on an order that still owes goods (status `processing` or `partially_fulfilled`, no returns), `in_transit` = something shipped and something has not arrived, `delivered` = every shipment arrived, `returned` = any items came back (a partial return included).","enum":["not_shipped","in_transit","delivered","returned"]},{"name":"source","required":false,"type":"string","enum":["web","mobile","pos","api","subscription_engine"]},{"name":"q","required":false,"type":"string","description":"Search order id, number, source, status, or metadata."},{"name":"customerId","required":false,"type":"string"},{"name":"subscriptionId","required":false,"type":"string","description":"Return only the orders linked to this subscription: through one of their lines (every subscription a checkout creates), `subscriptionId`, or the legacy `metadata.subscription_id` pointer. Covers the signup order, renewals and plan-change charges."},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."},{"name":"include","required":false,"type":"string","description":"Add each order's line items, as GET /api/v1/orders/{id} answers them. Without it, list rows carry none.","enum":["lineItems"]}],"bodyFields":null,"description":"List orders with cursor pagination"},{"method":"POST","path":"/api/v1/orders","pathParams":[],"queryParams":[],"bodyFields":[{"name":"customerId","required":false,"type":"string"},{"name":"currency","required":false,"type":"string"},{"name":"source","required":false,"type":"string","enum":["web","mobile","pos","api"]},{"name":"billingAddress","required":false,"type":"object"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"notes","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"},{"name":"lineItems","required":false,"type":"object[]"}],"description":"Create a new order (draft)"},{"method":"GET","path":"/api/v1/orders/export.csv","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","enum":["draft","pending","processing","partially_fulfilled","fulfilled","cancelled","closed"]},{"name":"paymentStatus","required":false,"type":"string","enum":["pending","authorized","captured","partially_paid","partially_refunded","refunded","failed","voided","processing","disputed","expired","charged_back"]},{"name":"type","required":false,"type":"string","enum":["one_time","recurring","mixed"]},{"name":"delivery","required":false,"type":"string","description":"Where the goods are. Derived from shipment and return records, not an order column: `not_shipped` = nothing has left yet on an order that still owes goods (status `processing` or `partially_fulfilled`, no returns), `in_transit` = something shipped and something has not arrived, `delivered` = every shipment arrived, `returned` = any items came back (a partial return included).","enum":["not_shipped","in_transit","delivered","returned"]},{"name":"source","required":false,"type":"string","enum":["web","mobile","pos","api","subscription_engine"]},{"name":"q","required":false,"type":"string","description":"Search order id, number, source, status, or metadata."},{"name":"customerId","required":false,"type":"string"},{"name":"subscriptionId","required":false,"type":"string","description":"Return only the orders linked to this subscription: through one of their lines (every subscription a checkout creates), `subscriptionId`, or the legacy `metadata.subscription_id` pointer. Covers the signup order, renewals and plan-change charges."},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."},{"name":"include","required":false,"type":"string","description":"Add each order's line items, as GET /api/v1/orders/{id} answers them. Without it, list rows carry none.","enum":["lineItems"]}],"bodyFields":null,"summary":"Export orders (respecting list filters) as a CSV attachment. Capped at 10,000 rows."},{"method":"GET","path":"/api/v1/orders/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get an order by ID (includes line items, plus `capturedAmount` and `refundedAmount`)"},{"method":"PATCH","path":"/api/v1/orders/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"billingAddress","required":false,"type":"object"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"notes","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update order fields (addresses, notes, metadata)"},{"method":"POST","path":"/api/v1/orders/{id}/checkout","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Initiate checkout (draft -> pending)"},{"method":"POST","path":"/api/v1/orders/{id}/authorize","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentId","required":true,"type":"string"}],"description":"Mark payment as authorized (pending -> processing)"},{"method":"POST","path":"/api/v1/orders/{id}/capture","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentId","required":true,"type":"string"}],"description":"Mark payment as captured (pending -> processing)"},{"method":"POST","path":"/api/v1/orders/{id}/cancel","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":false,"type":"string"},{"name":"refundCapturedPayments","required":false,"type":"boolean"}],"description":"Cancel an order. Authorized payments and unpaid Net-N invoices (`method: net30`, status `authorized` or `pending`) are always voided; captured payments are refunded when refundCapturedPayments is true."},{"method":"POST","path":"/api/v1/orders/{id}/status","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"status","required":true,"type":"string","enum":["draft","pending","processing","partially_fulfilled","fulfilled","cancelled","closed"]},{"name":"reason","required":false,"type":"string"}],"description":"Move an order to any lifecycle status. Both directions are allowed — this is the merchant override, not a state-machine step. Side effects already applied are never rewound. Moving to `cancelled` additionally requires the `order_cancellations:write` scope and voids the order's live authorizations and unpaid Net-N invoices, exactly as `POST /orders/{id}/cancel` does; captured payments are left alone."},{"method":"POST","path":"/api/v1/orders/{id}/comp","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string"}],"description":"Write off the order's remaining balance. Money already captured stays captured; the buyer is never charged and no processor is contacted. `compAmount` is set to the balance outstanding; `total` is NOT reduced, because the order is still a sale of that size — the comp is a credit recorded against it. What the buyer owes is `total - compAmount`, so `paymentStatus` settles at `captured` and `displayStatus` reads \"… · Comped\"."},{"method":"POST","path":"/api/v1/orders/{id}/comp/reverse","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Undo a comp. The order owes what it owed again: `compAmount` returns to 0 (`total` never moved) and `paymentStatus` falls back out of `captured` on its own. Side effects of the comp are NOT rewound: an authorization voided at the processor cannot be un-voided, so collecting the restored balance needs a new payment, and a tax document voided or returned at the provider needs a manual re-file (`POST /v1/tax-documents/{id}/retry`)."},{"method":"POST","path":"/api/v1/orders/{id}/hold","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string"}],"description":"Freeze an order operationally. A hold is a flag, not a stage: `status`, `paymentStatus` and `displayStatus` are unchanged, and nothing about money or delivery moves. Holdable while the order is still live (`pending`, `processing`, `partially_fulfilled`, `fulfilled`); a draft, cancelled or closed order answers 422 `order_not_holdable`. Re-holding with the same reason is a no-op and does not restart `heldAt`; a new reason overwrites it. `heldBy` comes from the caller's credentials and cannot be supplied."},{"method":"POST","path":"/api/v1/orders/{id}/hold/release","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Lift a hold. All four hold columns are cleared together. An order that is not held answers 422 `order_not_on_hold`."},{"method":"GET","path":"/api/v1/orders/{id}/status-history","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Append-only record of every status change on this order, oldest first."},{"method":"GET","path":"/api/v1/orders/{id}/timeline","pathParams":["id"],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"cursor","required":false,"type":"string"}],"bodyFields":null,"description":"Everything that happened to this order, newest first: status changes, payment attempts (including declines, which write no status-history row), and fulfillment events. One row shape for every source."},{"method":"POST","path":"/api/v1/orders/{id}/close","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Close a fulfilled order (archive it from active views)"},{"method":"GET","path":"/api/v1/orders/{id}/payments","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List payments for an order"},{"method":"POST","path":"/api/v1/orders/{id}/payments","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"processor","required":false,"type":"string"},{"name":"amount","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"currency","required":false,"type":"string"},{"name":"method","required":false,"type":"string","enum":["card","bank_transfer","wallet","cash","cheque","external","manual","net30"]},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Create a payment for an order"},{"method":"POST","path":"/api/v1/orders/{id}/payments/record","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"amount","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"currency","required":false,"type":"string"},{"name":"method","required":true,"type":"string","enum":["cash","bank_transfer","cheque","external"]},{"name":"receivedAt","required":false,"type":"string"},{"name":"reference","required":false,"type":"string"},{"name":"note","required":false,"type":"string"}],"description":"Record money that arrived outside Throttle — cash, a bank transfer to the merchant's own account, a cheque. The payment is created already captured, so the order advances exactly as a processor capture would. Excluded from billable GMV. When the order's balance is on an unpaid Net-N invoice (`method: net30`, status `authorized` or `pending`), the payment goes to that invoice: an amount equal to the invoice settles it — the invoice payment itself is captured, as marking it paid does (`payment.captured`), the recorded method/reference/note are kept in its `metadata.recordedPayment`, and that pay"},{"method":"GET","path":"/api/v1/orders/{id}/payments/{paymentId}","pathParams":["id","paymentId"],"queryParams":[],"bodyFields":null,"description":"Get a specific payment for an order"},{"method":"GET","path":"/api/v1/payments/{id}/transactions","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List transactions for a payment"},{"method":"GET","path":"/api/v1/payments","pathParams":[],"queryParams":[{"name":"method","required":false,"type":"string"},{"name":"status","required":false},{"name":"limit","required":false,"type":"string"},{"name":"cursor","required":false,"type":"string"},{"name":"aging","required":false,"type":"string","enum":["0_30","31_60","61_90","90_plus"]},{"name":"order_id","required":false,"type":"string"},{"name":"due_from","required":false,"type":"string"},{"name":"due_to","required":false,"type":"string"},{"name":"amount_min","required":false,"type":"string"},{"name":"amount_max","required":false,"type":"string"}],"bodyFields":null,"summary":"List payments for the calling merchant."},{"method":"GET","path":"/api/v1/payments/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get a payment by id."},{"method":"POST","path":"/api/v1/orders/{id}/refund","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"amount","required":false,"type":"integer","description":"Partial refund amount (defaults to everything still refundable on the order)"},{"name":"reason","required":false,"type":"string"}],"description":"Refund an order. Spread across its captured payments, newest capture first, when the order was paid in instalments."},{"method":"POST","path":"/api/v1/payments/{id}/authorize","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Authorize a payment (pending -> authorized)"},{"method":"POST","path":"/api/v1/payments/{id}/capture","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"amount","required":false,"type":"integer","description":"Partial capture amount (defaults to full amount)"}],"description":"Capture a payment (authorized -> captured)"},{"method":"POST","path":"/api/v1/payments/{id}/void","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Void an authorized payment, or cancel an unpaid Net-N invoice (`method: net30`, status `authorized` or `pending`). A pending card payment is still in flight at the processor and cannot be voided; captured money must be refunded."},{"method":"POST","path":"/api/v1/payments/{id}/mark-failed","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string","description":"Why the money never arrived. Stored on the payment and shown in the timeline."}],"description":"Record that a payment failed with no processor involved — a cheque that bounced, a wire that never arrived, a buyer who abandoned a 3DS challenge. Only `pending` and `processing` payments can be marked failed: captured money must be refunded, and a live authorization must be voided so the hold is released."},{"method":"POST","path":"/api/v1/payments/{id}/refund","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"amount","required":false,"type":"integer","description":"Partial refund amount (defaults to full amount)"},{"name":"reason","required":false,"type":"string"}],"description":"Refund a captured payment (full or partial)"},{"method":"POST","path":"/api/v1/payments/{id}/invoice/resend","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Resend the Net-N invoice email to the customer."},{"method":"GET","path":"/api/v1/payments/{id}/invoice-pdf","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get a signed download URL for a Net30 invoice PDF."},{"method":"GET","path":"/api/v1/invoices","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Pagination cursor"},{"name":"limit","required":false,"type":"integer"},{"name":"sort","required":false,"type":"string","enum":["asc","desc"]},{"name":"status","required":false,"type":"string","enum":["paid","open","refunded","partially_refunded","void"]},{"name":"type","required":false,"type":"string","enum":["order","net30","subscription"]},{"name":"sourceId","required":false,"type":"string","description":"Filter to invoices for a specific source: the payment id for order/net30 invoices, or the subscription invoice id for subscription invoices."}],"bodyFields":null,"summary":"List invoices","description":"List all invoices for the application across all customers and payment source types. Requires invoices:read scope."},{"method":"GET","path":"/api/v1/customers/{customerId}/invoices","pathParams":["customerId"],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Pagination cursor"},{"name":"limit","required":false,"type":"integer"},{"name":"sort","required":false,"type":"string","enum":["asc","desc"]},{"name":"status","required":false,"type":"string","enum":["paid","open","refunded","partially_refunded","void"]},{"name":"type","required":false,"type":"string","enum":["order","net30","subscription"]},{"name":"sourceId","required":false,"type":"string","description":"Filter to invoices for a specific source: the payment id for order/net30 invoices, or the subscription invoice id for subscription invoices."}],"bodyFields":null,"summary":"List invoices for a customer","description":"List all invoices scoped to a specific customer. Requires invoices:read scope."},{"method":"GET","path":"/api/v1/invoices/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get invoice","description":"Fetch a single invoice by ID. Requires invoices:read scope."},{"method":"GET","path":"/api/v1/invoices/{id}/download","pathParams":["id"],"queryParams":[{"name":"format","required":false,"type":"string","enum":["json"]}],"bodyFields":null,"summary":"Download invoice PDF","description":"Returns a 302 redirect to a short-lived signed S3 URL for the invoice PDF. Pass ?format=json to receive the URL as JSON instead. Requires invoices:read scope."},{"method":"GET","path":"/api/v1/orders/{orderId}/fulfillments","pathParams":["orderId"],"queryParams":[],"bodyFields":null,"description":"List fulfillments for an order"},{"method":"POST","path":"/api/v1/orders/{orderId}/fulfillments","pathParams":["orderId"],"queryParams":[],"bodyFields":[{"name":"type","required":true,"type":"string","enum":["shipment","digital","access_grant","service","in_person","custom"]},{"name":"lineItemIds","required":true,"type":"object[]"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"},{"name":"shipment","required":false,"type":"object","description":"Shipment detail to seed at creation; only accepted when type is 'shipment'. A trackingNumber here fires fulfillment.shipment.shipped right after fulfillment.created, exactly as the first PATCH .../shipment that sets one would. Omit it to record tracking later."}],"description":"Create a fulfillment for an order"},{"method":"GET","path":"/api/v1/orders/{orderId}/fulfillments/{id}","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Get a fulfillment by ID (includes type-specific details)"},{"method":"POST","path":"/api/v1/orders/{orderId}/fulfillments/{id}/processing","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Mark fulfillment as processing"},{"method":"POST","path":"/api/v1/orders/{orderId}/fulfillments/{id}/complete","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Mark fulfillment as completed"},{"method":"POST","path":"/api/v1/orders/{orderId}/fulfillments/{id}/cancel","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Cancel a fulfillment"},{"method":"POST","path":"/api/v1/fulfillments/{id}/delivered","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"deliveredAt","required":false,"type":"string","description":"When the parcel arrived. Defaults to now."}],"description":"Record that a shipment arrived. Writes `shipments.actualDelivery`, which surfaces as the order's `Delivered` label and fires `fulfillment.shipment.delivered`. Refuses with `422 fulfillment_not_shipped` before carrier handoff and `409 already_delivered` on a second call."},{"method":"PATCH","path":"/api/v1/orders/{orderId}/fulfillments/{id}/shipment","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Update shipment details for a fulfillment"},{"method":"PATCH","path":"/api/v1/orders/{orderId}/fulfillments/{id}/digital","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Update digital delivery details"},{"method":"PATCH","path":"/api/v1/orders/{orderId}/fulfillments/{id}/access","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Update access grant details"},{"method":"PATCH","path":"/api/v1/orders/{orderId}/fulfillments/{id}/service","pathParams":["orderId","id"],"queryParams":[],"bodyFields":null,"description":"Update service delivery details"},{"method":"GET","path":"/api/v1/subscriptions","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"customerId","required":false,"type":"string"},{"name":"externalCustomerId","required":false,"type":"string","description":"Filter by the merchant's own customer ID (the value passed as externalId on customer creation). Server resolves to the throttle customerId before filtering. Mutually exclusive with customerId."},{"name":"status","required":false,"type":"string","enum":["active","paused","cancelled","past_due","trialing","unpaid","completed"]},{"name":"interval","required":false,"type":"string","description":"A named interval, or \"custom\" when intervalUnit/intervalCount describe any other cadence","enum":["weekly","biweekly","monthly","quarterly","yearly","custom"]},{"name":"installment","required":false,"type":"boolean","description":"true: only installment plans; false: only ongoing subscriptions"},{"name":"q","required":false,"type":"string","description":"Search subscription id, customer id, plan reference, plan name, status, interval, and metadata."},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List subscriptions with cursor pagination"},{"method":"POST","path":"/api/v1/subscriptions","pathParams":[],"queryParams":[],"bodyFields":[{"name":"applicationId","required":false,"type":"string","description":"Optional application ID override (resolved from auth context when absent)"},{"name":"customerId","required":true,"type":"string","description":"ID of the customer to subscribe"},{"name":"planReference","required":true,"type":"string","description":"Your plan identifier (e.g. \"pro_monthly\")"},{"name":"planName","required":false,"type":"string","description":"Human-readable plan name shown on invoices"},{"name":"interval","required":false,"type":"string","description":"A named interval, or \"custom\" when intervalUnit/intervalCount describe any other cadence"},{"name":"intervalUnit","required":false,"type":"string","description":"Cadence unit. Send with intervalCount instead of, or together with, interval."},{"name":"intervalCount","required":false,"type":"number","description":"Cadence count: every N units. At most one year (8760 hours, 365 days, 52 weeks, 12 months)."},{"name":"totalPayments","required":false,"type":"integer","description":"Makes this an installment plan of exactly this many payments (2 to 60). Cannot be combined with trialEnd or changed later."},{"name":"amount","required":false,"type":"integer","description":"Subscription amount in the smallest currency unit (e.g. cents). Required unless `schedule` is sent. 0 is refused (400 invalid_amount) unless `allowZeroAmount: true` is sent."},{"name":"allowZeroAmount","required":false,"type":"boolean","description":"Set to true to allow `amount: 0` (a free or usage-only plan that renews for nothing). Without it, `amount: 0` is refused with 400 invalid_amount. Applies to this request only; it is not stored."},{"name":"schedule","required":false,"type":"object[]","description":"A custom installment plan: 2–60 payments. Row 0 is charged now and has no gap; each later row has amount + intervalUnit + intervalCount (its gap after the previous payment, 1 hour to 1 year). Exclusive with interval, totalPayments and trialEnd. amount (if sent) must equal schedule[0].amount; currentPeriodEnd is derived."},{"name":"currency","required":false,"type":"string","description":"ISO 4217 currency code (defaults to USD). Normalised to upper case; must match the application’s configured currency (422 currency_mismatch otherwise)."},{"name":"currentPeriodStart","required":true,"description":"ISO 8601 start of the current billing period"},{"name":"currentPeriodEnd","required":false,"description":"ISO 8601 end of the current billing period. Must be after currentPeriodStart and in the future (a small clock-skew grace is allowed) — a past currentPeriodEnd is never renewed."},{"name":"trialEnd","required":false,"description":"ISO 8601 date-time when the trial ends (omit if no trial). Cannot be before currentPeriodStart."},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata stored with the subscription"},{"name":"deliveryMethod","required":false,"type":"string","description":"'shipment' = a physical subscription: every renewal order owes a box and ships to shippingAddress. 'access_grant' (default) = nothing to ship.","enum":["access_grant","shipment"]},{"name":"shippingAddress","required":false,"type":"object","description":"Required with deliveryMethod 'shipment'; refused otherwise."},{"name":"orderId","required":false,"type":"string","description":"The order that paid for the first period. Links the two in both directions: the order gets `subscriptionId` (and the legacy `metadata.subscription_id`), and this subscription's first invoice gets `orderId`. Use this when you charged the signup yourself and created the subscription afterwards. 404 if the order does not exist in this application and environment."}],"description":"Create a new subscription"},{"method":"GET","path":"/api/v1/subscriptions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a subscription by ID"},{"method":"PATCH","path":"/api/v1/subscriptions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"planReference","required":false,"type":"string"},{"name":"planName","required":false,"type":"string"},{"name":"interval","required":false,"type":"string","description":"A named interval, or \"custom\" when intervalUnit/intervalCount describe any other cadence"},{"name":"intervalUnit","required":false,"type":"string","description":"Cadence unit. Send with intervalCount instead of, or together with, interval."},{"name":"intervalCount","required":false,"type":"number","description":"Cadence count: every N units. At most one year (8760 hours, 365 days, 52 weeks, 12 months)."},{"name":"amount","required":false,"type":"integer","description":"Amount in cents. 0 is refused (400 invalid_amount) unless `allowZeroAmount: true` is sent."},{"name":"allowZeroAmount","required":false,"type":"boolean","description":"Set to true to allow `amount: 0` (a free or usage-only plan that renews for nothing). Without it, `amount: 0` is refused with 400 invalid_amount. Applies to this request only; it is not stored."},{"name":"taxAddress","required":false,"type":"object|null"},{"name":"shippingAddress","required":false,"type":"object","description":"Where a physical subscription ships, from the next renewal. 422 subscription_not_physical on a subscription that does not ship."},{"name":"metadata","required":false,"type":"object"}],"description":"Update a subscription (plan change, amount, interval)"},{"method":"GET","path":"/api/v1/subscriptions/{id}/invoices","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/subscriptions/{id}/invoices/{invoiceId}/refund","pathParams":["id","invoiceId"],"queryParams":[],"bodyFields":[{"name":"amount","required":false,"type":"integer","description":"Minor units. Omit to refund everything still outstanding on the cycle."},{"name":"reason","required":false,"type":"string"},{"name":"intent","required":true,"type":"string","description":"`money_only` returns the money and keeps billing; `refund_and_cancel` also ends the subscription immediately. Required — there is no default.","enum":["money_only","refund_and_cancel"]}],"description":"Refund one of a subscription's billing cycles"},{"method":"PATCH","path":"/api/v1/subscriptions/{id}/payment-method","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentMethodId","required":true,"type":"string","description":"One of the subscription customer's saved cards in this environment: active, in date, and vaulted for merchant-initiated charges."}],"description":"Set the saved card this one subscription renews on. The customer's default card and their other subscriptions stay as they are."},{"method":"POST","path":"/api/v1/subscriptions/{id}/pause","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Pause an active subscription"},{"method":"POST","path":"/api/v1/subscriptions/{id}/retry-charge","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Retry a past-due subscription's failed renewal charge immediately"},{"method":"POST","path":"/api/v1/subscriptions/{id}/waive-period","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string"}],"description":"Forgive a past-due subscription's current period — settle it at zero and advance"},{"method":"POST","path":"/api/v1/subscriptions/{id}/resume","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Resume a paused subscription"},{"method":"POST","path":"/api/v1/subscriptions/{id}/change-plan","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"planReference","required":true,"type":"string","description":"Your plan identifier for the new plan"},{"name":"planName","required":false,"type":"string","description":"Human-readable name for the new plan"},{"name":"interval","required":false,"type":"string","description":"A named interval, or \"custom\" when intervalUnit/intervalCount describe any other cadence"},{"name":"intervalUnit","required":false,"type":"string","description":"Cadence unit. Send with intervalCount instead of, or together with, interval."},{"name":"intervalCount","required":false,"type":"number","description":"Cadence count: every N units. At most one year (8760 hours, 365 days, 52 weeks, 12 months)."},{"name":"amount","required":true,"type":"integer","description":"Amount in the smallest currency unit (e.g. cents). 0 is refused (400 invalid_amount) unless `allowZeroAmount: true` is sent."},{"name":"allowZeroAmount","required":false,"type":"boolean","description":"Set to true to allow `amount: 0` (a free or usage-only plan that renews for nothing). Without it, `amount: 0` is refused with 400 invalid_amount. Applies to this request only; it is not stored."},{"name":"effective","required":true,"type":"string","description":"When the plan change takes effect","enum":["now","period_end"]}],"description":"Schedule or apply a plan change on a subscription"},{"method":"POST","path":"/api/v1/subscriptions/{id}/change-quantity","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"quantity","required":true,"type":"integer","description":"New seat count"},{"name":"effective","required":true,"type":"string","description":"When the seat change takes effect","enum":["now","period_end"]}],"description":"Change the seat quantity on a subscription (immediate prorated, or deferred to period end)"},{"method":"DELETE","path":"/api/v1/subscriptions/{id}/pending-change","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Cancel a pending scheduled plan change on a subscription"},{"method":"POST","path":"/api/v1/subscriptions/{id}/cancel","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"atPeriodEnd","required":false,"type":"boolean","description":"If true, cancels at the end of the current billing period"},{"name":"refund","required":false,"type":"string","description":"Money to return alongside an immediate cancellation. `prorated` credits the unused part of the current period, capped at what was actually paid for it — if nothing was taken for the current period the subscription is still cancelled, with a refund of 0. `last_cycle` returns the whole last paid cycle. Rejected when atPeriodEnd is true, and with 409 invalid_state on a subscription that is already ca","enum":["none","prorated","last_cycle"]}],"description":"Cancel a subscription (immediately or at period end)"},{"method":"GET","path":"/api/v1/subscriptions/{id}/usage","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List usage items for the subscription's current billing period."},{"method":"POST","path":"/api/v1/subscriptions/{id}/usage","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"kind","required":true,"type":"string"},{"name":"unitCount","required":true,"type":"integer"},{"name":"unitPriceCents","required":true,"type":"integer"}],"description":"Record (upsert) a usage item for the subscription's current billing period."},{"method":"POST","path":"/api/v1/subscriptions/eligibility-check","pathParams":[],"queryParams":[],"bodyFields":[{"name":"paymentMethodId","required":true,"type":"string","description":"customerPaymentMethods row id. Must belong to the authenticated merchant. The server resolves the card fingerprint internally."}],"description":"Pre-flight check whether a payment method is eligible for a free trial on this merchant. Card fingerprint match against any prior subscription with a trialEnd blocks the trial."},{"method":"GET","path":"/api/v1/discounts","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"isActive","required":false,"type":"boolean"},{"name":"code","required":false,"type":"string"},{"name":"type","required":false,"type":"string","enum":["percentage","fixed_amount"]},{"name":"q","required":false,"type":"string","description":"Search discount code, name, type, or metadata."},{"name":"sort","required":false,"type":"string","description":"Sort by creation time.","enum":["asc","desc"]},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List discounts with cursor pagination"},{"method":"POST","path":"/api/v1/discounts","pathParams":[],"queryParams":[],"bodyFields":[{"name":"code","required":false,"type":"string","description":"Leave empty for automatic discounts"},{"name":"name","required":true,"type":"string"},{"name":"type","required":true,"type":"string","enum":["percentage","fixed_amount"]},{"name":"value","required":true,"type":"integer","description":"Percentage as a whole number (25 = 25%) or fixed amount in minor units"},{"name":"conditions","required":false,"type":"object","description":"e.g. { minOrder: 5000 }"},{"name":"usageLimit","required":false,"type":"integer"},{"name":"maxRedemptionsPerCustomer","required":false,"type":"integer|null","description":"Per-customer redemption limit. Use null for unlimited."},{"name":"startsAt","required":false,"type":"string"},{"name":"endsAt","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Create a new discount"},{"method":"GET","path":"/api/v1/discounts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a discount by ID"},{"method":"PATCH","path":"/api/v1/discounts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"code","required":false,"type":"string|null","description":"Leave null for automatic discounts"},{"name":"name","required":false,"type":"string"},{"name":"type","required":false,"type":"string","enum":["percentage","fixed_amount"]},{"name":"value","required":false,"type":"integer"},{"name":"conditions","required":false,"type":"object"},{"name":"usageLimit","required":false,"type":"integer|null"},{"name":"maxRedemptionsPerCustomer","required":false,"type":"integer|null","description":"Per-customer redemption limit. Use null for unlimited."},{"name":"isActive","required":false,"type":"boolean"},{"name":"startsAt","required":false,"type":"string|null"},{"name":"endsAt","required":false,"type":"string|null"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a discount"},{"method":"DELETE","path":"/api/v1/discounts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Delete a discount"},{"method":"POST","path":"/api/v1/discounts/validate","pathParams":[],"queryParams":[],"bodyFields":[{"name":"code","required":true,"type":"string"},{"name":"orderTotal","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"customerId","required":false,"type":"string"}],"description":"Validate a discount code against an order total"},{"method":"POST","path":"/api/v1/discounts/preview","pathParams":[],"queryParams":[],"bodyFields":[{"name":"code","required":true,"type":"string"},{"name":"currency","required":true,"type":"string"},{"name":"subtotal","required":true,"type":"integer","description":"Amount in cents (e.g. 1999 = $19.99)"},{"name":"customerId","required":false,"type":"string"},{"name":"lineItems","required":false,"type":"object[]"}],"description":"Preview a discount code against a subtotal without mutating a cart"},{"method":"GET","path":"/api/v1/quotes","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","description":"Comma-separated status filter, e.g. proposed,accepted"},{"name":"q","required":false,"type":"string","description":"Search quote number, customer email, or buyer reference"},{"name":"assignedMemberId","required":false,"type":"string"},{"name":"customerId","required":false,"type":"string"},{"name":"createdAfter","required":false,"type":"string","description":"ISO 8601 lower bound on creation time, EXCLUSIVE (created_at > value)."},{"name":"createdBefore","required":false,"type":"string","description":"ISO 8601 upper bound on creation time, EXCLUSIVE (created_at < value)."}],"bodyFields":null,"description":"List quotes with cursor pagination"},{"method":"POST","path":"/api/v1/quotes","pathParams":[],"queryParams":[],"bodyFields":[{"name":"status","required":false,"type":"string","enum":["draft","requested"]},{"name":"customerId","required":false,"type":"string|null"},{"name":"customerEmail","required":false,"type":"string|null"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"source","required":false,"type":"string","enum":["dashboard","api"]},{"name":"assignedMemberId","required":false,"type":"string|null"},{"name":"currency","required":false,"type":"string"},{"name":"internalNotes","required":false,"type":"string|null"},{"name":"items","required":false,"type":"object[]"},{"name":"paymentTerms","required":false,"type":"object","description":"pay_in_full | net_terms (netN 1-365) | deposit_balance (deposit percent/fixed + balanceNetN)"},{"name":"expiresAt","required":false,"description":"ISO 8601 date-time, or null to clear"},{"name":"buyerNote","required":false,"type":"string|null"},{"name":"leadTime","required":false,"type":"string|null"},{"name":"shippingMode","required":false,"type":"string","enum":["none","flat","checkout_calculated","free"]},{"name":"shippingFlatAmount","required":false,"type":"integer|null"},{"name":"collect","required":false,"type":"object","description":"Address steps the hosted checkout shows after acceptance. Omit to leave unchanged; null on a flag restores the derived default."},{"name":"metadata","required":false,"type":"object"}],"description":"Create a quote (draft, or requested for RFQ intake)"},{"method":"GET","path":"/api/v1/quotes/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a quote with revisions, comments, and timeline (merchant view)"},{"method":"PATCH","path":"/api/v1/quotes/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"assignedMemberId","required":false,"type":"string|null"},{"name":"customerId","required":false,"type":"string|null"},{"name":"customerEmail","required":false,"type":"string|null"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"internalNotes","required":false,"type":"string|null"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"},{"name":"status","required":false,"type":"string","enum":["archived","declined"]},{"name":"declinedReason","required":false,"type":"string|null","description":"With status 'declined': the reason shown to the buyer."}],"description":"Update quote assignment, linkage, internal notes, or archive it"},{"method":"POST","path":"/api/v1/quotes/{id}/revisions","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Start a new working revision cloned from the latest issued revision"},{"method":"PATCH","path":"/api/v1/quotes/{id}/revisions/{revId}","pathParams":["id","revId"],"queryParams":[],"bodyFields":[{"name":"items","required":false,"type":"object[]"},{"name":"paymentTerms","required":false,"type":"object","description":"pay_in_full | net_terms (netN 1-365) | deposit_balance (deposit percent/fixed + balanceNetN)"},{"name":"expiresAt","required":false,"description":"ISO 8601 date-time, or null to clear"},{"name":"buyerNote","required":false,"type":"string|null"},{"name":"leadTime","required":false,"type":"string|null"},{"name":"shippingMode","required":false,"type":"string","enum":["none","flat","checkout_calculated","free"]},{"name":"shippingFlatAmount","required":false,"type":"integer|null"},{"name":"collect","required":false,"type":"object","description":"Address steps the hosted checkout shows after acceptance. Omit to leave unchanged; null on a flag restores the derived default."},{"name":"metadata","required":false,"type":"object"},{"name":"changeSummary","required":false,"type":"string|null"}],"description":"Edit the working revision (items, terms, expiry, notes)"},{"method":"POST","path":"/api/v1/quotes/{id}/issue","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Freeze the working revision, supersede the prior one, and propose the quote"},{"method":"POST","path":"/api/v1/quotes/{id}/rotate-link","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Rotate the buyer link token (invalidates the old link)"},{"method":"POST","path":"/api/v1/quotes/{id}/comments","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"body","required":true,"type":"string"},{"name":"visibility","required":false,"type":"string","enum":["shared","internal"]},{"name":"revisionId","required":false,"type":"string|null"}],"description":"Add a merchant comment (shared with the buyer, or internal)"},{"method":"POST","path":"/api/v1/carts/{id}/request-quote","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"buyerReference","required":false,"type":"string|null"},{"name":"note","required":false,"type":"string|null"}],"description":"Snapshot a cart's lines into a requested quote (the cart is unchanged)"},{"method":"POST","path":"/api/v1/quotes/{id}/accept","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"revisionId","required":true,"type":"string"},{"name":"acceptedByName","required":true,"type":"string"},{"name":"acceptedByEmail","required":true,"type":"string"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"itemSelections","required":false,"type":"object[]"},{"name":"reason","required":false,"type":"string|null"}],"description":"Record a rep-given acceptance (phone/email deal) and start checkout (spec §8, §9)"},{"method":"GET","path":"/api/v1/quote-links/{token}","pathParams":["token"],"queryParams":[],"bodyFields":null,"description":"Get a quote by its buyer link token (public, buyer-shaped)"},{"method":"POST","path":"/api/v1/quote-links/{token}/view","pathParams":["token"],"queryParams":[],"bodyFields":[],"description":"Record a buyer view of the quote link (throttled quote.viewed webhook)"},{"method":"POST","path":"/api/v1/quote-links/{token}/comments","pathParams":["token"],"queryParams":[],"bodyFields":[{"name":"authorName","required":false,"type":"string|null"},{"name":"authorEmail","required":false,"type":"string|null"},{"name":"body","required":true,"type":"string"}],"description":"Add a buyer comment (always shared)"},{"method":"POST","path":"/api/v1/quote-links/{token}/request-revision","pathParams":["token"],"queryParams":[],"bodyFields":[{"name":"authorName","required":false,"type":"string|null"},{"name":"authorEmail","required":false,"type":"string|null"},{"name":"message","required":false,"type":"string|null"}],"description":"Ask for changes instead of accepting the current proposal"},{"method":"POST","path":"/api/v1/quote-links/{token}/decline","pathParams":["token"],"queryParams":[],"bodyFields":[{"name":"authorName","required":false,"type":"string|null"},{"name":"authorEmail","required":false,"type":"string|null"},{"name":"reason","required":false,"type":"string|null"}],"description":"Decline the quote"},{"method":"POST","path":"/api/v1/quote-links/{token}/accept","pathParams":["token"],"queryParams":[],"bodyFields":[{"name":"revisionId","required":true,"type":"string"},{"name":"acceptedByName","required":true,"type":"string"},{"name":"acceptedByEmail","required":true,"type":"string"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"itemSelections","required":false,"type":"object[]"}],"description":"Accept the quote and start checkout (spec §8)"},{"method":"POST","path":"/api/v1/quote-links/{token}/checkout","pathParams":["token"],"queryParams":[],"bodyFields":[],"description":"Return an accepted quote to a live checkout session (spec §8.2)"},{"method":"GET","path":"/api/v1/quote-links/{token}/pdf","pathParams":["token"],"queryParams":[],"bodyFields":null,"description":"Download the quote PDF (302 redirect to a short-lived signed URL; lazy-rendered from the frozen issued revision)"},{"method":"GET","path":"/api/v1/quote-request-forms","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List RFQ intake forms for the application + environment"},{"method":"POST","path":"/api/v1/quote-request-forms","pathParams":[],"queryParams":[],"bodyFields":[{"name":"slug","required":true,"type":"string"},{"name":"title","required":false,"type":"string|null"},{"name":"introText","required":false,"type":"string|null"},{"name":"successMessage","required":false,"type":"string|null"},{"name":"redirectUrl","required":false,"type":"string|null","description":"Must be http(s)"},{"name":"fields","required":false,"type":"object"}],"description":"Create a hosted RFQ intake form (token revealed once)"},{"method":"PATCH","path":"/api/v1/quote-request-forms/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"isActive","required":false,"type":"boolean"},{"name":"title","required":false,"type":"string|null"},{"name":"introText","required":false,"type":"string|null"},{"name":"successMessage","required":false,"type":"string|null"},{"name":"redirectUrl","required":false,"type":"string|null","description":"Must be http(s)"},{"name":"fields","required":false,"type":"object"}],"description":"Update an RFQ intake form (activate/deactivate, texts, fields)"},{"method":"POST","path":"/api/v1/quote-request-forms/{id}/rotate-token","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Rotate the form token (old URL 404s immediately; new token revealed once)"},{"method":"GET","path":"/api/v1/quote-request-forms/{token}/public","pathParams":["token"],"queryParams":[],"bodyFields":null,"description":"Public form config for the hosted RFQ page (token-authenticated)"},{"method":"POST","path":"/api/v1/quote-requests","pathParams":[],"queryParams":[],"bodyFields":[{"name":"formToken","required":true,"type":"string"},{"name":"email","required":true,"type":"string"},{"name":"name","required":false,"type":"string|null"},{"name":"companyName","required":false,"type":"string|null"},{"name":"phone","required":false,"type":"string|null"},{"name":"buyerReference","required":false,"type":"string|null"},{"name":"message","required":false,"type":"string|null"},{"name":"items","required":false,"type":"object[]","description":"Lines the buyer is asking about. Seeded into the quote's working revision unpriced — targetUnitPrice is the buyer's ask, never the quoted price."},{"name":"cartId","required":false,"type":"string|null","description":"A cart the buyer already filled; its lines join the request. Resolved inside the form's own application + environment."},{"name":"website","required":false,"type":"string|null","description":"Honeypot — must be empty"},{"name":"formLoadedAt","required":false,"type":"number","description":"Client mount time (ms epoch); min fill time enforced"},{"name":"turnstileToken","required":false,"type":"string"}],"description":"Public RFQ submission (honeypot + min-fill-time + rate limit + optional Turnstile)"},{"method":"GET","path":"/api/v1/webhooks","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List all webhooks for the organization. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"POST","path":"/api/v1/webhooks","pathParams":[],"queryParams":[],"bodyFields":[{"name":"url","required":true,"type":"string"},{"name":"events","required":true,"type":"string[]","description":"Event types (e.g. [\"order.created\", \"payment.captured\"])"},{"name":"secret","required":false,"type":"string","description":"HMAC secret (auto-generated if omitted)"},{"name":"description","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Register a new webhook. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"GET","path":"/api/v1/webhooks/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a webhook by ID. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"PATCH","path":"/api/v1/webhooks/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"url","required":false,"type":"string"},{"name":"events","required":false,"type":"string[]"},{"name":"isActive","required":false,"type":"boolean"},{"name":"description","required":false,"type":"string"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update a webhook. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"DELETE","path":"/api/v1/webhooks/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Delete a webhook. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"GET","path":"/api/v1/webhooks/{id}/deliveries","pathParams":["id"],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","enum":["pending","success","failed","dead_letter"]}],"bodyFields":null,"description":"List delivery attempts for a webhook. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"POST","path":"/api/v1/webhooks/{webhookId}/deliveries/{id}/retry","pathParams":["webhookId","id"],"queryParams":[],"bodyFields":null,"description":"Retry a failed webhook delivery. DEPRECATED — use POST /api/v1/webhook-endpoints (signed, Stripe-style) instead. This legacy endpoint no longer delivers events."},{"method":"GET","path":"/api/v1/extensions","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"q","required":false,"type":"string"},{"name":"installable","required":false,"type":"string","enum":["true","false"]},{"name":"lifecycle","required":false,"type":"string","enum":["draft","private","public"]}],"bodyFields":null,"description":"List available extensions"},{"method":"POST","path":"/api/v1/extensions","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string"},{"name":"description","required":false,"type":"string"},{"name":"version","required":false,"type":"string"},{"name":"author","required":false,"type":"string"},{"name":"iconUrl","required":false,"type":"string"},{"name":"homepageUrl","required":false,"type":"string"},{"name":"scopes","required":true,"type":"string[]","description":"Permission scopes the extension requires"},{"name":"eventSubscriptions","required":false,"type":"string[]","description":"Webhook event types the extension subscribes to"},{"name":"iframeUrl","required":false,"type":"string","description":"HTTPS URL to embed as an iframe panel in the dashboard"},{"name":"webhookUrl","required":false,"type":"string","description":"HTTPS endpoint that receives subscribed events"},{"name":"lineResolverUrl","required":false,"type":"string","description":"HTTPS endpoint (default port) Throttle calls to price cart lines this extension owns. Requires webhookUrl and at least one eventSubscription: calls are signed with the webhook signing secret."},{"name":"configSchema","required":false,"type":"object","description":"JSON Schema defining accepted configuration"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Register a new extension"},{"method":"GET","path":"/api/v1/extensions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get extension by ID"},{"method":"PATCH","path":"/api/v1/extensions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"description","required":false,"type":"string"},{"name":"version","required":false,"type":"string"},{"name":"author","required":false,"type":"string"},{"name":"iconUrl","required":false,"type":"string"},{"name":"homepageUrl","required":false,"type":"string"},{"name":"scopes","required":false,"type":"string[]"},{"name":"eventSubscriptions","required":false,"type":"string[]"},{"name":"iframeUrl","required":false,"type":"string"},{"name":"webhookUrl","required":false,"type":"string"},{"name":"lineResolverUrl","required":false,"type":"string","description":"null removes the line resolver."},{"name":"configSchema","required":false,"type":"object"},{"name":"metadata","required":false,"type":"object","description":"Arbitrary key-value metadata"}],"description":"Update extension metadata"},{"method":"DELETE","path":"/api/v1/extensions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Delete an extension"},{"method":"POST","path":"/api/v1/extensions/{id}/client-credentials","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"installCallbackUrl","required":false,"type":"string","description":"HTTPS endpoint that receives the signed install callback. Plain http:// is refused."}],"summary":"Issue (or rotate) client credentials for a catalog extension","description":"Generates a new clientId/clientSecret pair so the extension can fetch its own per-install credentials with no human copy-pasting secrets. Only the secret's SHA-256 digest is stored — the raw secret is returned here once and never again. Calling this again on an extension that already has credentials rotates them (the previous secret stops verifying immediately). Dashboard-only: requires `extensions:write` plus the develop permission check, and is not on the extension_client allow-list."},{"method":"GET","path":"/api/v1/extensions/{id}/versions","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"List versions for an extension, ordered newest first"},{"method":"POST","path":"/api/v1/extensions/{id}/versions","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"version","required":true,"type":"string","description":"Semantic version string, e.g. \"1.2.0\""},{"name":"changelog","required":false,"type":"string","description":"Human-readable changelog for this version"}],"description":"Create a new draft version of an extension by snapshotting the current working-copy manifest"},{"method":"GET","path":"/api/v1/extensions/{id}/scripts","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"List an extension's buyer-facing scripts"},{"method":"POST","path":"/api/v1/extensions/{id}/scripts","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Create or replace a buyer-facing script on an extension"},{"method":"PATCH","path":"/api/v1/extensions/{id}/scripts/{scriptId}","pathParams":["id","scriptId"],"queryParams":[],"bodyFields":null,"summary":"Update a buyer-facing script"},{"method":"DELETE","path":"/api/v1/extensions/{id}/scripts/{scriptId}","pathParams":["id","scriptId"],"queryParams":[],"bodyFields":null,"summary":"Delete a buyer-facing script"},{"method":"POST","path":"/api/v1/extensions/{id}/versions/{vid}/publish","pathParams":["id","vid"],"queryParams":[],"bodyFields":null,"description":"Publish a draft version of an extension"},{"method":"POST","path":"/api/v1/extensions/{id}/lifecycle","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"lifecycle","required":true,"type":"string","enum":["draft","private","public"]}],"description":"Update the lifecycle state of an extension (draft → private → public)"},{"method":"POST","path":"/api/v1/extensions/{id}/install","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"versionId","required":false,"type":"string","description":"Specific version to pin. Omit to use the default version (the approved version for public extensions)."},{"name":"config","required":false,"type":"object","description":"Configuration values for this installation"}],"description":"Install an extension for the organization. Returns a one-time API key. Without versionId, pins the default version (the approved version of a public extension, else the latest published). With versionId: 404 if it is not a version of the extension; 422 draft_not_installable_in_live for a draft in production; 422 version_not_approved if the caller does not own the extension and the version is not the default version (owners may pin any version, and drafts outside production)."},{"method":"POST","path":"/api/v1/extensions/{id}/uninstall","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Uninstall an extension (deactivates API key and webhooks)"},{"method":"POST","path":"/api/v1/extensions/{id}/suspend","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Suspend an installed extension (deactivates API key and webhooks, can be reinstalled)"},{"method":"PATCH","path":"/api/v1/installations/{id}/config","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"config","required":true,"type":"object"}],"description":"Update configuration for an installed extension"},{"method":"GET","path":"/api/v1/installations","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"status","required":false,"type":"string","enum":["active","suspended","uninstalled"]}],"bodyFields":null,"description":"List installed extensions for the organization"},{"method":"GET","path":"/api/v1/installations/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get one installation of the current application and environment by id. 404 when it belongs to another application or environment."},{"method":"POST","path":"/api/v1/installations/{id}/upgrade","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"targetVersionId","required":true,"type":"string","description":"ID of the target extension version to upgrade to"},{"name":"acknowledgedNewScripts","required":false,"type":"boolean","description":"Consent for scripts the target version adds or escalates (new script, dom tier, wider consent category, higher PII grade, or a new external domain)."},{"name":"acknowledgedNewScopes","required":false,"type":"boolean","description":"Set to true to consent to new scopes added by the target version"}],"description":"Upgrade an active installation to a target version of the installed extension, under the same pinning rule as an install with versionId. Returns 404 if the target is not a version of that extension, 409 installation_not_active if the installation is suspended or uninstalled, 409 if the new version adds scopes or scripts that require consent, 422 draft_not_installable_in_live for a draft in production, and 422 version_not_approved if the caller does not own the extension and the target is not its default version (the approved version of a public extension, else the latest published)."},{"method":"POST","path":"/api/v1/installations/{id}/launch-token","pathParams":["id"],"queryParams":[],"bodyFields":[],"description":"Mint a short-lived RS256 session JWT for an iframe extension. The token carries full installation context and expires in 10 minutes. Re-calling this endpoint refreshes the token (no separate refresh route)."},{"method":"GET","path":"/api/v1/installations/{id}/webhook-secret","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Read this installation's webhook signing secret","description":"Returns the signing secret for the installation's managed webhook endpoint, so an extension can verify delivery signatures without a human copying the secret out of the dashboard. Requires authentication but no particular scope: the caller must present the installation's own API key or extension session token, the extension's own client credential (Basic clientId:clientSecret), or be a dashboard user permitted to manage installs. The secret is stable across uninstall/reinstall."},{"method":"POST","path":"/api/v1/installations/{id}/rotate-webhook-secret","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"graceSeconds","required":false,"type":"integer"}],"summary":"Rotate this installation's webhook signing secret","description":"Mints a new signing secret for the installation's managed webhook endpoint and returns it once. For `graceSeconds` (default 86400, max 604800) every delivery is signed with both the outgoing and the new secret — one `v1=` digest each, new last — so a receiver that verifies against every digest never fails a delivery, and one that keeps only the last digest verifies from the moment it holds the new secret. `graceSeconds: 0` revokes the old secret immediately (use for a leaked secret). A signed `extension.webhook_secret_rotated` event is delivered to the endpoint. Same authorization as reading t"},{"method":"POST","path":"/api/v1/installations/{id}/api-key","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"graceSeconds","required":false,"type":"integer"}],"summary":"Mint a fresh API key for this installation and grace-expire its predecessor","description":"API keys are hashed at rest, so there is nothing to read back — this issues a NEW key with the scopes of the installation's pinned version and returns the raw value once. The key it replaces keeps working for `graceSeconds` (default 86400, max 604800) via `api_keys.expires_at`, so an extension that restarts mid-delivery never locks itself out. Same authorization as the webhook-secret routes: the installation's own extension-client credential, or a dashboard user permitted to manage installs."},{"method":"GET","path":"/api/v1/extensions/me/installations","pathParams":[],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"cursor","required":false,"type":"string"}],"bodyFields":null,"summary":"List this extension's own installations","description":"Lets an extension enumerate its own installs with no human copy-pasting secrets. This is the recovery path if an install callback is dropped, never configured, or the extension loses its datastore. `extension_client`-only: any other credential gets 404, not 403 — we do not confirm this route exists to a credential with no business here."},{"method":"GET","path":"/api/v1/installations/{id}/deliveries","pathParams":["id"],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"offset","required":false,"type":"integer"}],"bodyFields":null,"description":"List webhook deliveries for an extension installation (most recent first)"},{"method":"POST","path":"/api/v1/installations/{id}/deliveries/{deliveryId}/replay","pathParams":["id","deliveryId"],"queryParams":[],"bodyFields":[],"description":"Replay a webhook delivery for an extension installation"},{"method":"POST","path":"/api/v1/installations/{id}/test","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Send a verification ping to an extension installation webhook endpoint"},{"method":"GET","path":"/api/v1/extensions/{id}/listing","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PUT","path":"/api/v1/extensions/{id}/listing","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/extensions/{id}/readiness","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/extensions/{id}/reviews","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/{id}/reviews","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/extensions/{id}/reviews/{sid}","pathParams":["id","sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/{id}/reviews/{sid}/comments","pathParams":["id","sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/{id}/reviews/{sid}/withdraw","pathParams":["id","sid"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/publisher/terms","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/publisher/accept-terms","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/extensions/domains","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/domains","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/extensions/domains/{id}/verify","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/affiliates/me/code","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get or create affiliate code"},{"method":"POST","path":"/api/v1/affiliates/me/code/regenerate","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Regenerate affiliate code"},{"method":"GET","path":"/api/v1/affiliates/me/stats","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get affiliate stats"},{"method":"GET","path":"/api/v1/affiliates/me/signups","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List referred signups"},{"method":"POST","path":"/api/v1/partner/applications","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Apply for partner status"},{"method":"GET","path":"/api/v1/partner/me/profile","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get partner profile"},{"method":"GET","path":"/api/v1/partner/me/referrals","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List partner referrals"},{"method":"GET","path":"/api/v1/partner/me/seats","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List partner seats in client workspaces"},{"method":"GET","path":"/api/v1/partner/me/commissions","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get commission stats"},{"method":"POST","path":"/api/v1/partner/trials","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Create trial for client"},{"method":"POST","path":"/api/v1/partner/trials/{referralId}/promote","pathParams":["referralId"],"queryParams":[],"bodyFields":null,"summary":"Hand off client workspace to client ownership"},{"method":"POST","path":"/api/v1/partner/trials/{referralId}/revoke-handoff","pathParams":["referralId"],"queryParams":[],"bodyFields":null,"summary":"Undo a handoff while the client ownership invite is outstanding"},{"method":"POST","path":"/api/v1/partner/trials/{referralId}/claim-billing","pathParams":["referralId"],"queryParams":[],"bodyFields":null,"summary":"Partner claims billing responsibility"},{"method":"GET","path":"/api/v1/partner-seats","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List partner seats on this workspace"},{"method":"PATCH","path":"/api/v1/partner-seats/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Update seat permissions"},{"method":"DELETE","path":"/api/v1/partner-seats/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Remove a partner seat"},{"method":"GET","path":"/api/v1/events/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a single event by ID"},{"method":"GET","path":"/api/v1/events","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string","description":"Cursor for pagination (last item ID)"},{"name":"limit","required":false,"type":"integer","description":"Number of items per page"},{"name":"type","required":false,"type":"string","description":"Filter by event type"},{"name":"entityType","required":false,"type":"string","description":"Filter by entity type"},{"name":"entityId","required":false,"type":"string","description":"Filter by entity ID"}],"bodyFields":null,"description":"List events (immutable audit log)"},{"method":"GET","path":"/api/v1/scopes","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/event-types","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/whoami","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Identify the calling credential","description":"Returns the credential type, granted scopes, and the workspace, application and environment the credential is pinned to. Requires authentication but no particular scope."},{"method":"GET","path":"/.well-known/openai-apps-challenge","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/.well-known/extension-jwks.json","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/.well-known/oauth-authorization-server","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/.well-known/oauth-protected-resource","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/oauth/clients/{clientId}","pathParams":["clientId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/checkout/sessions","pathParams":[],"queryParams":[],"bodyFields":[{"name":"applicationId","required":true,"type":"string"},{"name":"cartId","required":false,"type":"string"},{"name":"externalCartId","required":false,"type":"string"},{"name":"customerEmail","required":false,"type":"string"},{"name":"customer","required":false,"type":"object"},{"name":"returnUrl","required":true,"type":"string"},{"name":"cancelUrl","required":true,"type":"string"},{"name":"allowedMethods","required":false,"type":"string[]"},{"name":"paymentTerms","required":false,"type":"object"},{"name":"recurring","required":false,"type":"object"},{"name":"collect","required":false,"type":"object"},{"name":"metadata","required":false,"type":"object"},{"name":"discountCode","required":false,"type":"string"},{"name":"clientContext","required":false,"type":"object"}],"description":"Create a new hosted checkout session"},{"method":"GET","path":"/api/v1/checkout/sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a checkout session by ID"},{"method":"DELETE","path":"/api/v1/checkout/sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Cancel a checkout session"},{"method":"GET","path":"/api/v1/checkout-sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a customer-facing checkout session by ID (public)"},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/embed-config","pathParams":["id"],"queryParams":[{"name":"parentOrigin","required":false,"type":"string","description":"Origin of the page embedding the checkout. When sent, the response adds `parentOriginAllowed`: whether that origin is on the application's allowed origins, wildcard entries included."}],"bodyFields":null,"description":"Get customer-facing embed config by checkout session ID (public)"},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/cart","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Get a customer-facing checkout session cart by session ID (public)"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/calculate","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Calculate customer-facing checkout session totals by session ID (public)"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/validate-address","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Validate a customer-facing checkout address by session ID (public)"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Apply a customer-facing checkout discount by session ID (public)"},{"method":"DELETE","path":"/api/v1/checkout-sessions/{id}/discount","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Remove a customer-facing checkout discount by session ID (public)"},{"method":"POST","path":"/api/v1/checkout/sessions/{id}/complete","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"email","required":false,"type":"string"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"billingAddress","required":false,"type":"object"},{"name":"billingSameAsShipping","required":false,"type":"boolean"},{"name":"paymentMethod","required":true,"type":"string","description":"`embedded` completes a card payment taken by the payment embed; `net30` issues an invoice on terms. `card` names the card category in `allowedMethods` but is not a completion rail: it is rejected with 422 `payment_method_not_supported`. Use `embedded`.","enum":["net30","card","embedded"]},{"name":"netDays","required":false,"type":"integer"},{"name":"termsAccepted","required":false,"type":"boolean"},{"name":"termsSnapshot","required":false,"type":"string"},{"name":"invoiceNumber","required":false,"type":"string"},{"name":"net30Acceptance","required":false,"type":"object"},{"name":"paymentMethodId","required":false,"type":"string","description":"Charge a card the customer already saved instead of collecting a new one. Ownership is verified against this session's customer before anything is charged; a card belonging to anyone else is refused."},{"name":"paymentToken","required":false,"type":"string"},{"name":"processorCheckoutSessionId","required":false,"type":"string"},{"name":"processorTransactionId","required":false,"type":"string"},{"name":"clientContext","required":false,"type":"object"}],"description":"Complete a checkout session"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/complete","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"email","required":false,"type":"string"},{"name":"shippingAddress","required":false,"type":"object"},{"name":"billingAddress","required":false,"type":"object"},{"name":"billingSameAsShipping","required":false,"type":"boolean"},{"name":"paymentMethod","required":true,"type":"string","description":"`embedded` completes a card payment taken by the payment embed; `net30` issues an invoice on terms. `card` names the card category in `allowedMethods` but is not a completion rail: it is rejected with 422 `payment_method_not_supported`. Use `embedded`.","enum":["net30","card","embedded"]},{"name":"netDays","required":false,"type":"integer"},{"name":"termsAccepted","required":false,"type":"boolean"},{"name":"termsSnapshot","required":false,"type":"string"},{"name":"invoiceNumber","required":false,"type":"string"},{"name":"net30Acceptance","required":false,"type":"object"},{"name":"paymentMethodId","required":false,"type":"string","description":"Charge a card the customer already saved instead of collecting a new one. Ownership is verified against this session's customer before anything is charged; a card belonging to anyone else is refused."},{"name":"paymentToken","required":false,"type":"string"},{"name":"processorCheckoutSessionId","required":false,"type":"string"},{"name":"processorTransactionId","required":false,"type":"string"},{"name":"clientContext","required":false,"type":"object"}],"description":"Public customer-facing complete"},{"method":"POST","path":"/api/v1/providers/{provider}/webhooks/{connectionId}","pathParams":["provider","connectionId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/payment-providers/{provider}/webhooks","pathParams":["provider"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/payment-providers/{provider}/webhooks/{connectionId}","pathParams":["provider","connectionId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/checkout-sessions/embed-token","pathParams":[],"queryParams":[],"bodyFields":[{"name":"amount","required":true,"type":"integer","description":"Amount in minor units (e.g. cents)"},{"name":"currency","required":true,"type":"string","description":"ISO 4217 currency code"},{"name":"country","required":false,"type":"string","description":"ISO 3166-1 alpha-2 country code"},{"name":"externalCartId","required":false,"type":"string","description":"Optional external cart reference"},{"name":"buyerExternalIdentifier","required":false,"type":"string","description":"Optional Gr4vy buyer external identifier. When set, Gr4vy associates the resulting stored payment method with this buyer so future charges can reference it by id. Required for the platform-billing card-vault flow; omitted for one-shot checkout sessions."},{"name":"recurring","required":false,"type":"boolean","description":"When true, this embed captures a card for recurring/merchant-initiated billing: the Gr4vy widget is rendered with paymentSource=recurring + store=true (card-only, vaulted) and the buyer is pinned for re-mint. Requires buyerExternalIdentifier. Defaults to false (one-shot payment showing all enabled methods)."},{"name":"addCard","required":false,"type":"boolean","description":"When true (with recurring), the embed is a pure add-a-card flow: checkout-web renders the Gr4vy widget with display='addOnly' (just a new-card form, no stored methods, no checkout framing) and stores the card for the pinned buyer. Use for 'manage payment methods → add card'. Defaults to false."}],"description":"Mint a Gr4vy Embed token for card capture. The token is scoped to a server-side checkout session."},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/embed-token","pathParams":["id"],"queryParams":[],"bodyFields":null,"description":"Re-mint a Gr4vy Embed JWT for an existing throttle checkout session. Anonymous; the session id is the only secret needed."},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/card-session","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Start a Secure Fields card session (hosted checkout, no API key)"},{"method":"POST","path":"/api/v1/checkout-sessions/{id}/card-session","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Start a Secure Fields card session for a checkout session"},{"method":"GET","path":"/api/v1/api-keys","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List API keys for the calling merchant"},{"method":"POST","path":"/api/v1/api-keys","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"scopes","required":true,"type":"string[]"}],"summary":"Create a new API key (Clerk JWT only)"},{"method":"DELETE","path":"/api/v1/api-keys/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Revoke (soft-delete) an API key"},{"method":"POST","path":"/api/v1/api-keys/{id}/rotate","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"overlapHours","required":false,"type":"integer"}],"summary":"Rotate an API key with an overlap window (Clerk JWT only)"},{"method":"POST","path":"/api/v1/oauth/authorize","pathParams":[],"queryParams":[],"bodyFields":[{"name":"clientId","required":true,"type":"string"},{"name":"redirectUri","required":true,"type":"string"},{"name":"scope","required":true,"type":"string"},{"name":"codeChallenge","required":true,"type":"string"},{"name":"state","required":true,"type":"string"},{"name":"resource","required":false,"type":"string"},{"name":"workspaceId","required":true,"type":"string"},{"name":"applicationId","required":true,"type":"string"},{"name":"environmentId","required":true,"type":"string"},{"name":"applicationIds","required":false,"type":"string[]"}],"summary":"Approve an OAuth authorization request and mint a code (Clerk JWT only)"},{"method":"GET","path":"/api/v1/oauth-grants","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List OAuth grants (Connected Apps) for the caller workspace"},{"method":"DELETE","path":"/api/v1/oauth-grants/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Revoke an OAuth grant (Connected Apps)"},{"method":"GET","path":"/api/v1/merchants/me","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get current merchant"},{"method":"PATCH","path":"/api/v1/merchants/me","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"logoUrl","required":false,"type":"null"}],"summary":"Update merchant display name. Pass `logoUrl: null` to clear the logo. To set a logo, use POST /v1/merchants/me/logo."},{"method":"POST","path":"/v1/storefront/auth/register","pathParams":[],"queryParams":[],"bodyFields":[{"name":"email","required":true,"type":"string"},{"name":"password","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/login","pathParams":[],"queryParams":[],"bodyFields":[{"name":"email","required":true,"type":"string"},{"name":"password","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/refresh","pathParams":[],"queryParams":[],"bodyFields":[{"name":"refreshToken","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/logout","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/auth/logout-all","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/auth/verify-email","pathParams":[],"queryParams":[],"bodyFields":[{"name":"token","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/verify-email/resend","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/auth/forgot-password","pathParams":[],"queryParams":[],"bodyFields":[{"name":"email","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/reset-password","pathParams":[],"queryParams":[],"bodyFields":[{"name":"token","required":true,"type":"string"},{"name":"password","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/auth/step-up","pathParams":[],"queryParams":[],"bodyFields":[{"name":"password","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/me/change-password","pathParams":[],"queryParams":[],"bodyFields":[{"name":"password","required":true,"type":"string"}]},{"method":"GET","path":"/v1/storefront/me","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/v1/storefront/me","pathParams":[],"queryParams":[],"bodyFields":[{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"company","required":false,"type":"string|null"},{"name":"acceptsMarketing","required":false,"type":"boolean"}]},{"method":"GET","path":"/v1/storefront/me/sessions","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/v1/storefront/me/sessions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/addresses","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/addresses","pathParams":[],"queryParams":[],"bodyFields":[{"name":"label","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"addressLine1","required":true,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":true,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":true,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"isDefault","required":false,"type":"boolean"}]},{"method":"PATCH","path":"/v1/storefront/me/addresses/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"label","required":false,"type":"string"},{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"addressLine1","required":false,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":false,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":false,"type":"string"},{"name":"phone","required":false,"type":"string"},{"name":"isDefault","required":false,"type":"boolean"}]},{"method":"DELETE","path":"/v1/storefront/me/addresses/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/payment-methods","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/v1/storefront/me/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"isDefault","required":true,"type":"string","enum":["true","false"]}]},{"method":"DELETE","path":"/v1/storefront/me/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/payment-methods/embed-token","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/payment-methods/confirm","pathParams":[],"queryParams":[],"bodyFields":[{"name":"transactionId","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/me/carts/{cartId}/claim","pathParams":["cartId"],"queryParams":[],"bodyFields":[]},{"method":"GET","path":"/v1/storefront/me/orders","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string"},{"name":"limit","required":false,"type":"integer"}],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/orders/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/invoices","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string"},{"name":"limit","required":false,"type":"integer"}],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/invoices/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/subscriptions","pathParams":[],"queryParams":[{"name":"cursor","required":false,"type":"string"},{"name":"limit","required":false,"type":"integer"}],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/subscriptions/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/v1/storefront/me/invoices/{id}/pdf","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/subscriptions/{id}/pause","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/subscriptions/{id}/resume","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/storefront/me/subscriptions/{id}/cancel","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"atPeriodEnd","required":false,"type":"string","enum":["true","false"]}]},{"method":"PATCH","path":"/v1/storefront/me/subscriptions/{id}/shipping-address","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"firstName","required":false,"type":"string"},{"name":"lastName","required":false,"type":"string"},{"name":"company","required":false,"type":"string"},{"name":"addressLine1","required":true,"type":"string"},{"name":"addressLine2","required":false,"type":"string"},{"name":"city","required":true,"type":"string"},{"name":"stateProvince","required":false,"type":"string"},{"name":"postalCode","required":false,"type":"string"},{"name":"countryCode","required":true,"type":"string"},{"name":"phone","required":false,"type":"string"}]},{"method":"PATCH","path":"/v1/storefront/me/subscriptions/{id}/payment-method","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentMethodId","required":true,"type":"string"}]},{"method":"POST","path":"/v1/storefront/me/orders/{id}/cancel","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":false,"type":"string"}]},{"method":"POST","path":"/v1/storefront/me/orders/{id}/return-request","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":false,"type":"string"},{"name":"items","required":true,"type":"object[]"}]},{"method":"GET","path":"/api/v1/checkout-sessions/{id}/payment-methods","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"List payment methods available for a checkout session (public)"},{"method":"GET","path":"/api/v1/connectors","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List configured connectors for the calling merchant"},{"method":"POST","path":"/api/v1/connectors","pathParams":[],"queryParams":[],"bodyFields":[{"name":"paymentServiceDefinitionId","required":true,"type":"string"},{"name":"displayName","required":true,"type":"string"},{"name":"fields","required":true,"type":"object[]"},{"name":"acceptedCountries","required":false,"type":"string[]"},{"name":"acceptedCurrencies","required":false,"type":"string[]"},{"name":"active","required":false,"type":"boolean"}],"summary":"Create a new connector for the calling merchant"},{"method":"GET","path":"/api/v1/connectors/available","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List available connector types"},{"method":"GET","path":"/api/v1/connectors/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get a configured connector by id"},{"method":"PATCH","path":"/api/v1/connectors/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"paymentServiceDefinitionId","required":false,"type":"string"},{"name":"displayName","required":false,"type":"string"},{"name":"fields","required":false,"type":"object[]"},{"name":"acceptedCountries","required":false,"type":"string[]"},{"name":"acceptedCurrencies","required":false,"type":"string[]"},{"name":"active","required":false,"type":"boolean"}],"summary":"Update a connector for the calling merchant"},{"method":"DELETE","path":"/api/v1/connectors/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Delete a connector for the calling merchant"},{"method":"GET","path":"/api/v1/payment-routing","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the card-transaction routing config"},{"method":"PUT","path":"/api/v1/payment-routing","pathParams":[],"queryParams":[],"bodyFields":[{"name":"defaultCascade","required":true,"type":"string[]"},{"name":"rules","required":true,"type":"object[]"}],"summary":"Replace the card-transaction routing config"},{"method":"GET","path":"/api/v1/routing-connectors","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List connectors eligible for a routing cascade"},{"method":"GET","path":"/api/v1/routing-payment-methods","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List Gr4vy payment methods available to routing/decline rules"},{"method":"GET","path":"/api/v1/other-routing","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the non-card (redirect-transaction) routing config"},{"method":"PUT","path":"/api/v1/other-routing","pathParams":[],"queryParams":[],"bodyFields":[{"name":"rules","required":true,"type":"object[]"}],"summary":"Replace the non-card routing config"},{"method":"GET","path":"/api/v1/card-decline","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the card-transaction decline rules"},{"method":"PUT","path":"/api/v1/card-decline","pathParams":[],"queryParams":[],"bodyFields":[{"name":"rules","required":true,"type":"object[]"}],"summary":"Replace the card-transaction decline rules"},{"method":"GET","path":"/api/v1/other-decline","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the non-card (other) decline rules"},{"method":"PUT","path":"/api/v1/other-decline","pathParams":[],"queryParams":[],"bodyFields":[{"name":"rules","required":true,"type":"object[]"}],"summary":"Replace the non-card (other) decline rules"},{"method":"POST","path":"/api/v1/connectors/stripe/install-link","pathParams":[],"queryParams":[],"bodyFields":[],"summary":"Begin Stripe one-click connect"},{"method":"POST","path":"/api/v1/connectors/stripe/connect-key","pathParams":[],"queryParams":[],"bodyFields":[{"name":"secretKey","required":true,"type":"string"}],"summary":"Complete Stripe connect by pasting the restricted key"},{"method":"GET","path":"/api/v1/connectors/stripe/readiness","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Raw-card (PCI) readiness for the live Stripe connection"},{"method":"POST","path":"/api/v1/connectors/stripe/connect-oauth","pathParams":[],"queryParams":[],"bodyFields":[{"name":"code","required":true,"type":"string"},{"name":"state","required":true,"type":"string"}],"summary":"Complete Stripe connect from an OAuth authorization code"},{"method":"POST","path":"/api/v1/connectors/stripe/finalize","pathParams":[],"queryParams":[],"bodyFields":[{"name":"accountId","required":true,"type":"string"},{"name":"stripeUserId","required":true,"type":"string"},{"name":"state","required":true,"type":"string"},{"name":"installSignature","required":true,"type":"string"},{"name":"livemode","required":true,"type":"boolean"},{"name":"extraFields","required":false,"type":"object"}],"summary":"Finalize Stripe one-click connect"},{"method":"POST","path":"/api/v1/stripe-app/webhooks","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Inbound Stripe App webhook (uninstall handling)"},{"method":"GET","path":"/api/v1/payment-methods","pathParams":[],"queryParams":[{"name":"customerId","required":false,"type":"string"},{"name":"cartTotal","required":false,"type":"integer"}],"bodyFields":null,"summary":"List active payment methods derived from configured connectors"},{"method":"GET","path":"/api/v1/bigcommerce/connections","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List BigCommerce connections for the calling merchant"},{"method":"POST","path":"/api/v1/bigcommerce/connect","pathParams":[],"queryParams":[],"bodyFields":[{"name":"storeHash","required":true,"type":"string"},{"name":"accessToken","required":true,"type":"string"}],"summary":"Connect a BC store via static credentials"},{"method":"POST","path":"/api/v1/bigcommerce/connections/{id}/retry","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Retry webhook registration for a setup_failed connection"},{"method":"DELETE","path":"/api/v1/bigcommerce/connections/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Disconnect a BC store (soft-delete; 90-day cron hard-deletes after retention)"},{"method":"GET","path":"/api/v1/webhook-endpoints","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List configured outbound webhook endpoints"},{"method":"POST","path":"/api/v1/webhook-endpoints","pathParams":[],"queryParams":[],"bodyFields":[{"name":"url","required":true,"type":"string"},{"name":"enabledEvents","required":true,"type":"string[]"}],"summary":"Create an outbound webhook endpoint"},{"method":"GET","path":"/api/v1/webhook-endpoints/coverage","pathParams":[],"queryParams":[{"name":"days","required":false,"type":"integer"}],"bodyFields":null,"summary":"Event types emitted recently with no active subscriber","description":"Reports subscribable event types this application emitted in the lookback window that no active webhook endpoint is subscribed to. Use it to catch handlers wired up for events that can never arrive."},{"method":"PATCH","path":"/api/v1/webhook-endpoints/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"url","required":false,"type":"string"},{"name":"enabledEvents","required":false,"type":"string[]"},{"name":"isActive","required":false,"type":"boolean"}],"summary":"Update a webhook endpoint (URL, events, or active flag)"},{"method":"DELETE","path":"/api/v1/webhook-endpoints/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Soft-delete a webhook endpoint (sets deletedAt; excludes from list and dispatch)"},{"method":"POST","path":"/api/v1/webhook-endpoints/{id}/rotate-secret","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"graceSeconds","required":false,"type":"integer"}],"summary":"Rotate the signing secret for a webhook endpoint (reveal-once).","description":"Mints a new signing secret and returns it once. For `graceSeconds` (default 86400, max 604800) every delivery carries two `v1=` digests — the outgoing secret first, the new one last — so a receiver that checks every digest never fails a delivery, and one that keeps only the last digest verifies from the moment it holds the new secret. `graceSeconds: 0` revokes the old secret immediately."},{"method":"GET","path":"/api/v1/webhook-deliveries","pathParams":[],"queryParams":[{"name":"endpointId","required":false,"type":"string"},{"name":"orderId","required":false,"type":"string"},{"name":"status","required":false,"type":"string","enum":["pending","delivered","failed","dead_letter"]},{"name":"eventType","required":false,"type":"string"},{"name":"limit","required":false,"type":"integer"},{"name":"offset","required":false,"type":"integer"}],"bodyFields":null,"summary":"Recent webhook delivery attempts (debug / audit log). Paginated via limit + offset."},{"method":"GET","path":"/api/v1/webhook-deliveries/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Fetch a single webhook delivery (full envelope + signature scheme) for debugging."},{"method":"POST","path":"/api/v1/webhook-endpoints/{id}/test","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"eventType","required":false,"type":"string","enum":["cart.created","cart.updated","cart.item_added","cart.item_updated","cart.item_removed","cart.shipping_selected","cart.shipping_cleared","cart.discount_applied","cart.discount_removed","cart.tax_recomputed","cart.checkout_started","cart.converted","cart.abandoned","cart.merged","order.created","order.updated","order.fulfilled","order.cancelled","order.closed","order.comped","order.comp_reversed","order.held","order.hold_released","order.sync_failed","order.sync_conflict","return.created","return.updated","quote.requested","quote.proposed","quote.viewed","quote.comment_added","quote.revision_requested","quote.declined","quote.accepted","quote.converted","quote.expired","payment.pending","payment.authorized","payment.processing","payment.captured","payment.failed","payment.voided","payment.expired","payment.recorded","payment.refunded","payment.partially_refunded","payment.refund_failed","payment.vaulted","payment.disputed","payment.dispute_cleared","payment.dispute_lost","fulfillment.created","fulfillment.completed","fulfillment.cancelled","fulfillment.shipment.shipped","fulfillment.shipment.delivered","fulfillment.digital.delivered","subscription.created","subscription.activated","subscription.updated","subscription.plan_changed","subscription.plan_change_scheduled","subscription.paused","subscription.resumed","subscription.cancelled","subscription.completed","subscription.invoice_refunded","subscription.renewed","subscription.past_due","subscription.payment_failed","subscription.backup_pm_used","subscription.create_failed","subscription.trial_blocked","discount.applied","discount.removed","customer.created","customer.updated","customer.deleted","customer.payment_method_added","customer.payment_method_removed","customer.registered","customer.email_verified","customer.password_changed","customer.sessions_revoked","invoice.past_due","import.completed","script.loaded","script.blocked","script.error","shipping_tax.provider_connection.unhealthy","workspace.payment_method.added","workspace.payment_method.removed","workspace.payment_method.default_changed","workspace.payment_method.backup_set","workspace.payment_method.backup_used","workspace.platform_charge.succeeded","workspace.platform_charge.failed","workspace.trial_expired","extension.uninstalled","extension.webhook_secret_rotated"]},{"name":"data","required":false,"type":"object"}],"summary":"Send a synthetic, signed test delivery to this endpoint.","description":"Sends a synthetic, signed delivery of one event type. The endpoint must be subscribed to that type (an endpoint subscribed to all events accepts any type); otherwise the call fails with 400 validation_error naming the allowed types."},{"method":"POST","path":"/api/v1/webhook-deliveries/{id}/replay","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Replay a delivery (re-fires same payload with new signature)."},{"method":"POST","path":"/api/v1/merchants/me/external-cart-ack","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Mark this merchant as a non-BC (\"external cart\") merchant so onboarding can complete."},{"method":"POST","path":"/api/v1/merchants/me/finish-onboarding","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Mark the merchant as having finished the onboarding wizard."},{"method":"PATCH","path":"/api/v1/merchants/me/settings/net30","pathParams":[],"queryParams":[],"bodyFields":[{"name":"enabled","required":false,"type":"boolean"},{"name":"invoicePrefix","required":false,"type":"string"},{"name":"defaultNetDays","required":false,"type":"integer"},{"name":"termsText","required":false,"type":"string|null"}],"summary":"Update Net30 invoice billing settings."},{"method":"POST","path":"/api/v1/merchants/me/logo","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Upload a merchant logo (multipart/form-data, field: logo)."},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}/logo","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":null,"summary":"Upload an application logo."},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}/logo","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":null,"summary":"Delete an application logo."},{"method":"POST","path":"/api/v1/email/asset-upload","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Upload an image asset for inline use in an email template (multipart, field: file)."},{"method":"POST","path":"/api/v1/extensions/icon-upload","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Upload an extension icon (multipart/form-data, field: file).","description":"Accepts PNG, JPEG, WebP or SVG up to 2 MB and returns the public `iconUrl` to set on the extension. Any credential holding `extensions:write` may call it: a secret API key or a dashboard session."},{"method":"POST","path":"/api/v1/extensions/screenshot-upload","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Upload a marketplace listing screenshot (multipart/form-data, field: file).","description":"Accepts PNG, JPEG or WebP up to 5 MB and returns the public `screenshotUrl` to include in the listing `screenshots` array. Any credential holding `extensions:write` may call it: a secret API key or a dashboard session."},{"method":"GET","path":"/api/v1/assets/{*}","pathParams":["*"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/imports","pathParams":[],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"cursor","required":false,"type":"string"}],"bodyFields":null,"summary":"Imports for this application and environment, newest first."},{"method":"POST","path":"/api/v1/imports","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Start a bulk import: creates the import record and returns a presigned PUT the browser uploads the file to directly."},{"method":"POST","path":"/api/v1/imports/{id}/inspect","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Sniff the uploaded file: dialect, headers, a 20-row sample, the matched template and a suggested target field per header."},{"method":"PATCH","path":"/api/v1/imports/{id}/mapping","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Save the column-to-field mapping the merchant confirmed on the mapping screen."},{"method":"POST","path":"/api/v1/imports/{id}/validate","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Queue a dry run: reads the whole file under the saved mapping, reports what it would create, update, skip and reject, and writes nothing."},{"method":"POST","path":"/api/v1/imports/{id}/commit","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Queue the real import. Requires a completed dry run: an import that has not been validated is refused."},{"method":"POST","path":"/api/v1/imports/{id}/undo","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Queue the deletion of the rows this import created. Rows it only matched, and rows another record now depends on, are kept and reported on the import row."},{"method":"GET","path":"/api/v1/imports/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"One import, with its counters and derived progress."},{"method":"GET","path":"/api/v1/imports/{id}/errors","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"The row-level error report for an import, as a re-importable CSV plus the rows behind it. 404 when the import recorded no failures."},{"method":"GET","path":"/api/v1/audit-log","pathParams":[],"queryParams":[{"name":"limit","required":false,"type":"integer"},{"name":"environmentId","required":false,"type":"string"}],"bodyFields":null,"summary":"Recent admin actions taken on this merchant"},{"method":"POST","path":"/api/v1/fulfillments/{id}/digital/upload","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/fulfillments/{id}/digital/download","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/payments/{id}/invoice/download","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/net30/connection","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the calling merchant's Net30 connection"},{"method":"POST","path":"/api/v1/net30/connection","pathParams":[],"queryParams":[],"bodyFields":[{"name":"invoicePrefix","required":true,"type":"string"},{"name":"defaultNetDays","required":true,"type":"integer"},{"name":"termsText","required":false,"type":"string|null"},{"name":"maxOrderTotal","required":false,"type":"number|null"},{"name":"enabled","required":true,"type":"boolean"}],"summary":"Create the calling merchant's Net30 connection"},{"method":"PATCH","path":"/api/v1/net30/connection/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"invoicePrefix","required":false,"type":"string"},{"name":"defaultNetDays","required":false,"type":"integer"},{"name":"termsText","required":false,"type":"string|null"},{"name":"maxOrderTotal","required":false,"type":"number|null"},{"name":"enabled","required":false,"type":"boolean"}],"summary":"Update the calling merchant's Net30 connection"},{"method":"DELETE","path":"/api/v1/net30/connection/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Soft-delete (disable) the calling merchant's Net30 connection"},{"method":"GET","path":"/api/v1/net30/eligible-customers","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List the calling merchant's Net30 eligible customers"},{"method":"POST","path":"/api/v1/net30/eligible-customers","pathParams":[],"queryParams":[],"bodyFields":[{"name":"customerId","required":true,"type":"string"},{"name":"notes","required":false,"type":"string"}],"summary":"Add a customer to the Net30 eligible allowlist"},{"method":"DELETE","path":"/api/v1/net30/eligible-customers/{customerId}","pathParams":["customerId"],"queryParams":[],"bodyFields":null,"summary":"Remove a customer from the Net30 eligible allowlist"},{"method":"PATCH","path":"/api/v1/payments/{id}/notes","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"notes","required":true,"type":"string|null"}],"summary":"Update free-text notes on a payment (5000 char max)."},{"method":"POST","path":"/api/v1/payments/{id}/dispute","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"reason","required":true,"type":"string"}],"summary":"Open a dispute on a Net30 payment."},{"method":"POST","path":"/api/v1/payments/{id}/dispute/clear","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Clear an open dispute on a payment (leaves reason + opened_at for audit)."},{"method":"POST","path":"/api/v1/payments/{id}/backdate-due-date","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"daysPastDue","required":true,"type":"integer"}],"summary":"Backdate metadata.dueDate so a Net-N invoice falls into a specific aging bucket. Demo/test tool only."},{"method":"GET","path":"/api/v1/invoices/aging","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"AR aging report: outstanding Net30 payments bucketed by days past due."},{"method":"GET","path":"/api/v1/analytics/orders-timeseries","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"compareTo","required":false,"type":"string","enum":["previous_period","previous_year","none"]}],"bodyFields":null,"summary":"Order count + captured gross revenue over a date range, bucketed by day/week/month in a requested timezone (default trailing 30 days, UTC, daily)."},{"method":"GET","path":"/api/v1/analytics/business-summary","pathParams":[],"queryParams":[{"name":"period","required":false,"type":"string"},{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]}],"bodyFields":null,"summary":"Business summary: orders/revenue, subscription MRR, receivables, quotes — week/month/quarter, compared to the prior period of equal length."},{"method":"GET","path":"/api/v1/analytics/attention-digest","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Point-in-time digest: open disputes, subscriptions in dunning, overdue invoices, and webhooks with degraded delivery health."},{"method":"GET","path":"/api/v1/analytics/products","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"by","required":false,"type":"string","description":"Sort key: revenue or units. Defaults to revenue."},{"name":"limit","required":false,"type":"integer","description":"Max rows to return. Defaults to 20."}],"bodyFields":null,"summary":"Best-selling products over a date range, by revenue or units sold. Product identity is the external reference id when the merchant sent one, the line item name otherwise."},{"method":"GET","path":"/api/v1/analytics/customers","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"topBy","required":false,"type":"string","description":"Sort key for top customers: revenue or orders. Defaults to revenue."},{"name":"topLimit","required":false,"type":"integer","description":"Max top-customers rows to return. Defaults to 10."}],"bodyFields":null,"summary":"Customer growth over a date range: signups per day/week/month, new-vs-returning order split, and the highest-value customers in the window."},{"method":"GET","path":"/api/v1/analytics/revenue-breakdown","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"dimension","required":false,"type":"string","description":"Required. Breakdown dimension: paymentMethod, source, or currency."}],"bodyFields":null,"summary":"Revenue split by one dimension over a date range — payment method, order source, or currency. Amounts are gross; refunds are not deducted."},{"method":"GET","path":"/api/v1/analytics/funnel","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]}],"bodyFields":null,"summary":"Checkout funnel over a date range: carts created, checkout sessions started, orders completed, with the drop-off between each stage."},{"method":"GET","path":"/api/v1/analytics/subscriptions","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]}],"bodyFields":null,"summary":"Subscription movement over a date range: new subscriptions, cancellations, and net MRR change per bucket (day/week/month)."},{"method":"GET","path":"/api/v1/analytics/discounts","pathParams":[],"queryParams":[{"name":"from","required":false,"type":"string","description":"ISO 8601 start of range (exclusive lower bound)."},{"name":"to","required":false,"type":"string","description":"ISO 8601 end of range (exclusive upper bound). Defaults to now."},{"name":"days","required":false,"type":"string","description":"Shorthand for from = to - days. Ignored when from is set."},{"name":"timezone","required":false,"type":"string","description":"IANA timezone name or UTC offset (e.g., America/New_York, +05:30) for bucket boundaries. Defaults to UTC."},{"name":"groupBy","required":false,"type":"string","description":"Bucket size. Defaults to day.","enum":["day","week","month"]},{"name":"limit","required":false,"type":"integer","description":"Max rows to return. Defaults to 20."}],"bodyFields":null,"summary":"Discount code performance over a date range: redemption count, revenue on discounted orders, and total discount given per code."},{"method":"GET","path":"/api/v1/orders/{id}/returns","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"List an order's returns."},{"method":"POST","path":"/api/v1/orders/{id}/returns","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"items","required":true,"type":"object[]"},{"name":"reason","required":false,"type":"string"},{"name":"restock","required":false,"type":"boolean"}],"summary":"Open a return (RMA) against an order for a subset of its line items."},{"method":"GET","path":"/api/v1/returns/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Get a return and its items."},{"method":"POST","path":"/api/v1/returns/{id}/transition","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"action","required":true,"type":"string","enum":["approve","reject","receive","complete","cancel"]}],"summary":"Transition a return: approve | reject | receive | complete | cancel."},{"method":"POST","path":"/api/v1/returns/{id}/exchange","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"items","required":true,"type":"object[]"}],"summary":"Complete a return as an exchange: create a replacement order for the swapped items and settle the price difference (charge if more, refund if less)."},{"method":"PATCH","path":"/api/v1/orders/{id}/line-items","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"add","required":false,"type":"object[]"},{"name":"update","required":false,"type":"object[]"},{"name":"remove","required":false,"type":"string[]"}],"summary":"Add, update, or remove line items on an order. On a captured order the total delta is charged (increase) or refunded (decrease) automatically; on an order with an outstanding Net-N invoice, the invoice amount takes the delta instead."},{"method":"GET","path":"/api/v1/embed-config","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the merchant embed config (allowlisted parent origins + branding)"},{"method":"PUT","path":"/api/v1/embed-config","pathParams":[],"queryParams":[],"bodyFields":[{"name":"allowedOrigins","required":false,"type":"string[]"},{"name":"primaryColor","required":false,"type":"string"},{"name":"logoUrl","required":false,"type":"string"},{"name":"merchantName","required":false,"type":"string"},{"name":"storefrontBaseUrl","required":false,"type":"string|null","description":"Absolute base URL of your storefront (e.g. \"https://yourstore.com\"). Relative line-item imageUrls are resolved against it. Pass null to clear; when unset, the first allowedOrigin is used."},{"name":"verifyPath","required":false,"type":"string|null","description":"Path on your storefront that handles email-verification links, e.g. \"/auth/confirm\". Defaults to \"/account/verify\" (where the SDK component ships). Pass null to clear."},{"name":"resetPath","required":false,"type":"string|null","description":"Path on your storefront that handles password-reset links, e.g. \"/auth/new-password\". Defaults to \"/account/reset\". Pass null to clear."},{"name":"cartRecoveryUrlTemplate","required":false,"type":"string|null","description":"Absolute https URL template used to build the recovery link in abandoned-cart emails. Must contain a \"{cartId}\" placeholder, e.g. \"https://yourstore.com/cart?c={cartId}\". Pass null to clear; when unset, abandoned carts are recovered via the cart.abandoned webhook only (no recovery email)."},{"name":"cartAbandonmentThresholdMinutes","required":false,"type":"integer|null","description":"Minutes of inactivity before an open/checkout cart is treated as abandoned by the sweep. Range 15–129600 (90 days). Pass null to clear; when unset, the platform default of 1440 (24h) applies."},{"name":"checkoutLinkBaseUrl","required":false,"type":"string|null","description":"Absolute https URL your buyers land on for quote links and cart recovery links, e.g. \"https://yourstore.com\". Throttle appends its own path (\"/q/{shareToken}\", \"/r/{cartSessionToken}\"), so host those routes with the Throttle SDKs. Pass null to clear; when unset, links point at Throttle-hosted checkout."},{"name":"resolvedLinesOnly","required":false,"type":"boolean","description":"Browser carts may only hold resolved lines. When true, every cart session in this environment refuses browser-supplied prices: each line must be priced by an installed app's line resolver. Off by default."},{"name":"cartCurrencies","required":false,"type":"string[]","description":"Extra currencies a cart priced by an installed app's line resolver may use, besides the environment currency. Three-letter codes (upper-cased), unique, at most 10, none equal to the environment currency, each a currency shown and charged with two decimal places (JPY, KRW, KWD, BHD, HUF and IDR are refused for now). Pass [] to clear. Only the merchant may change it."}],"summary":"Update the merchant embed config"},{"method":"GET","path":"/api/v1/tracking-settings","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get per-environment analytics tracking settings (secrets masked)"},{"method":"PUT","path":"/api/v1/tracking-settings","pathParams":[],"queryParams":[],"bodyFields":[{"name":"ga4MeasurementId","required":false,"type":"string|null"},{"name":"metaPixelId","required":false,"type":"string|null"},{"name":"ga4ApiSecret","required":false,"type":"string|null"},{"name":"metaCapiAccessToken","required":false,"type":"string|null"},{"name":"serverSideEnabled","required":false,"type":"boolean"},{"name":"requireConsent","required":false,"type":"boolean"}],"summary":"Update per-environment analytics tracking settings. Omitted fields are unchanged; empty string clears a field."},{"method":"GET","path":"/api/v1/application-scripts","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List this environment’s merchant-authored scripts"},{"method":"POST","path":"/api/v1/application-scripts","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Create a merchant-authored script"},{"method":"PATCH","path":"/api/v1/application-scripts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Update a merchant-authored script"},{"method":"DELETE","path":"/api/v1/application-scripts/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Soft-delete a merchant-authored script"},{"method":"PUT","path":"/api/v1/application-scripts/kill-switch","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Disable or re-enable every script in this environment"},{"method":"GET","path":"/api/v1/application-scripts/app-inventory","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Every marketplace-app script active in this environment (read-only)"},{"method":"GET","path":"/api/v1/application-scripts/installs/{installId}","pathParams":["installId"],"queryParams":[],"bodyFields":null,"summary":"One installed app's scripts, with the merchant's per-install controls"},{"method":"GET","path":"/api/v1/application-scripts/health","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Last 24h load outcomes per script"},{"method":"GET","path":"/api/v1/storefront/scripts","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Resolve this application/environment's storefront scripts (publishable key)"},{"method":"GET","path":"/api/v1/storefront/script-frame-policy/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Origins permitted to frame a script sandbox (public)"},{"method":"GET","path":"/api/v1/storefront/script-assets/{id}/{sha256}","pathParams":["id","sha256"],"queryParams":[],"bodyFields":null,"summary":"Fetch a buyer-facing script by id and content hash (public, immutable)"},{"method":"POST","path":"/api/v1/storefront/script-events/{sessionId}","pathParams":["sessionId"],"queryParams":[],"bodyFields":null,"summary":"Record buyer-side script load outcomes for a checkout session"},{"method":"POST","path":"/api/v1/storefront/script-events","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Record buyer-side script load outcomes for a storefront or quote page"},{"method":"POST","path":"/api/v1/storefront/script-events/quote/{token}","pathParams":["token"],"queryParams":[],"bodyFields":null,"summary":"Record buyer-side script load outcomes for a hosted quote page"},{"method":"POST","path":"/v1/clerk/webhooks/user-created","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Clerk user.created webhook (Svix-verified)"},{"method":"GET","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PUT","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/mcp","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/oauth/token","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/v1/resend/webhooks","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/email/templates","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List all email template definitions with merchant overrides"},{"method":"GET","path":"/api/v1/email/templates/{key}","pathParams":["key"],"queryParams":[],"bodyFields":null,"summary":"Get a single email template definition with merchant override"},{"method":"PUT","path":"/api/v1/email/templates/{key}","pathParams":["key"],"queryParams":[],"bodyFields":null,"summary":"Upsert a merchant override for an email template"},{"method":"DELETE","path":"/api/v1/email/templates/{key}","pathParams":["key"],"queryParams":[],"bodyFields":null,"summary":"Delete merchant override for an email template (reset to default)"},{"method":"POST","path":"/api/v1/email/templates/{key}/preview","pathParams":["key"],"queryParams":[],"bodyFields":null,"summary":"Render a template with sample data for preview"},{"method":"POST","path":"/api/v1/email/test-send","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Send a test email to the authenticated admin (bypasses opt-out + cooldown)"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email/templates","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"List application email template definitions with application overrides"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email/templates/{key}","pathParams":["applicationId","key"],"queryParams":[],"bodyFields":null,"summary":"Get an application email template definition with application override"},{"method":"PUT","path":"/api/v1/applications/{applicationId}/email/templates/{key}","pathParams":["applicationId","key"],"queryParams":[],"bodyFields":null,"summary":"Upsert an application override for an email template"},{"method":"DELETE","path":"/api/v1/applications/{applicationId}/email/templates/{key}","pathParams":["applicationId","key"],"queryParams":[],"bodyFields":null,"summary":"Delete application override for an email template"},{"method":"POST","path":"/api/v1/applications/{applicationId}/email/templates/{key}/preview","pathParams":["applicationId","key"],"queryParams":[],"bodyFields":null,"summary":"Render an application template with sample data for preview"},{"method":"POST","path":"/api/v1/applications/{applicationId}/email/test-send","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Send an application-scoped test email to the authenticated admin"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email/messages","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"List recent email messages for the application"},{"method":"GET","path":"/api/v1/email/messages","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"List recent email messages for the merchant"},{"method":"GET","path":"/api/v1/merchants/me/email-settings","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get workspace email settings"},{"method":"PATCH","path":"/api/v1/merchants/me/email-settings","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Update workspace email settings"},{"method":"PATCH","path":"/api/v1/merchants/me/members/{id}/preferences","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"Update per-member email preferences"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Get application email settings"},{"method":"PATCH","path":"/api/v1/applications/{applicationId}/email-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Update application email settings"},{"method":"GET","path":"/api/v1/applications/{applicationId}/auth-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Get buyer-auth settings for an application"},{"method":"PATCH","path":"/api/v1/applications/{applicationId}/auth-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":[{"name":"enabled","required":false,"type":"boolean"}],"summary":"Update buyer-auth settings for an application"},{"method":"GET","path":"/api/v1/applications/{applicationId}/quote-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Get quote notification settings for an application"},{"method":"PATCH","path":"/api/v1/applications/{applicationId}/quote-settings","pathParams":["applicationId"],"queryParams":[],"bodyFields":[{"name":"notificationEmails","required":true,"type":"string[]"}],"summary":"Update quote notification settings for an application"},{"method":"GET","path":"/api/v1/customers/auth-summary","pathParams":[],"queryParams":[{"name":"ids","required":true,"type":"string"}],"bodyFields":null,"summary":"Account state for a page of customers"},{"method":"GET","path":"/api/v1/customers/{customerId}/auth","pathParams":["customerId"],"queryParams":[],"bodyFields":null,"summary":"Buyer account detail for one customer"},{"method":"POST","path":"/api/v1/customers/{customerId}/auth/sign-out-all","pathParams":["customerId"],"queryParams":[],"bodyFields":null,"summary":"Revoke every session for a customer"},{"method":"GET","path":"/api/v1/email/sender-domain","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Get the current custom sending domain state"},{"method":"POST","path":"/api/v1/email/sender-domain","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Register a custom sending domain via Resend"},{"method":"DELETE","path":"/api/v1/email/sender-domain","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Disconnect and remove the custom sending domain"},{"method":"POST","path":"/api/v1/email/sender-domain/verify","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"Trigger a domain verification check via Resend"},{"method":"GET","path":"/api/v1/applications/{applicationId}/email/sender-domain","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Get the current application custom sending domain state"},{"method":"POST","path":"/api/v1/applications/{applicationId}/email/sender-domain","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Register an application custom sending domain via Resend"},{"method":"DELETE","path":"/api/v1/applications/{applicationId}/email/sender-domain","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Disconnect and remove the application custom sending domain"},{"method":"POST","path":"/api/v1/applications/{applicationId}/email/sender-domain/verify","pathParams":["applicationId"],"queryParams":[],"bodyFields":null,"summary":"Trigger an application domain verification check via Resend"},{"method":"GET","path":"/api/v1/merchants/me/invites","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"[legacy] List merchant team members"},{"method":"POST","path":"/api/v1/merchants/me/invites","pathParams":[],"queryParams":[],"bodyFields":null,"summary":"[legacy] Invite a team member (delegates to team-service)"},{"method":"POST","path":"/api/v1/merchants/me/invites/{id}/resend","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"[legacy] Resend an invite"},{"method":"POST","path":"/api/v1/merchants/me/invites/{id}/revoke","pathParams":["id"],"queryParams":[],"bodyFields":null,"summary":"[legacy] Revoke an invite or remove a member"},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/invites","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/invites","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null,"summary":"Create a team invite"},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/invites/{id}/resend","pathParams":["workspaceId","id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/invites/{id}/revoke","pathParams":["workspaceId","id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/invites/accept","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/invites/pending","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/members","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/members/me","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/workspaces/{workspaceId}/members/{memberId}","pathParams":["workspaceId","memberId"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/members/{memberId}","pathParams":["workspaceId","memberId"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/members/{memberId}/applications/{applicationId}","pathParams":["workspaceId","memberId","applicationId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/auth/permissions","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/notifications/unread-count","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/notifications","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/notifications/{id}/read","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/notifications/{id}/unread","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/notifications/{id}/archive","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/notifications/read-all","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/me/preferences","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/me/preferences","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{wsId}/support/tickets","pathParams":["wsId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/tickets","pathParams":["wsId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{wsId}/support/tickets/{id}","pathParams":["wsId","id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/tickets/{id}/comments","pathParams":["wsId","id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/tickets/{id}/read","pathParams":["wsId","id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces/{wsId}/support/unread-count","pathParams":["wsId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/attachments/presign","pathParams":["wsId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/workspaces/{wsId}/support/attachments/{attachmentId}/confirm","pathParams":["wsId","attachmentId"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/support/dispatch-webhook","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/workspaces","pathParams":[],"queryParams":[],"bodyFields":null,"description":"List workspaces the authenticated user is a member of"},{"method":"POST","path":"/api/v1/workspaces","pathParams":[],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string","description":"URL-safe identifier, globally unique"},{"name":"email","required":false,"type":"string","description":"Owner email (used for member row); falls back to empty string if omitted"}],"description":"Create a new workspace; the calling user becomes owner"},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null,"description":"Get a single workspace by ID (must be a member)"},{"method":"PATCH","path":"/api/v1/workspaces/{workspaceId}","pathParams":["workspaceId"],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"slug","required":false,"type":"string"}],"description":"Update workspace name or slug (must be a member)"},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}","pathParams":["workspaceId"],"queryParams":[{"name":"force","required":false,"type":"string","enum":["true","false"]}],"bodyFields":null,"description":"Delete a workspace (must be a member; pass ?force=true to cascade-delete applications)"},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/environments","pathParams":["workspaceId"],"queryParams":[{"name":"includeArchived","required":false,"type":"string","enum":["true","false"]}],"bodyFields":null,"description":"List workspace environments"},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/environments","pathParams":["workspaceId"],"queryParams":[],"bodyFields":[{"name":"slug","required":true,"type":"string"},{"name":"name","required":true,"type":"string"}],"description":"Create a custom non-production sandbox environment"},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/environments/{environmentId}","pathParams":["workspaceId","environmentId"],"queryParams":[],"bodyFields":null,"description":"Archive a custom workspace environment"},{"method":"POST","path":"/api/v1/workspaces/{id}/go-live","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"acceptedProductionTermsAt","required":true,"type":"string"}],"summary":"Flip a sandbox workspace to production. Multi-precondition gated."},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/applications","pathParams":["workspaceId"],"queryParams":[],"bodyFields":null,"description":"List applications in a workspace (must be a member)"},{"method":"POST","path":"/api/v1/workspaces/{workspaceId}/applications","pathParams":["workspaceId"],"queryParams":[],"bodyFields":[{"name":"name","required":true,"type":"string"},{"name":"slug","required":true,"type":"string","description":"URL-safe identifier, unique within the workspace"},{"name":"currency","required":false,"type":"string"},{"name":"displayName","required":false,"type":"string|null"},{"name":"brandColor","required":false,"type":"string|null"},{"name":"allowedOrigins","required":false,"type":"string[]"}],"description":"Create a new application in a workspace (must be a member)"},{"method":"GET","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":null,"description":"Get a single application by ID (must be a workspace member)"},{"method":"PATCH","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":[{"name":"name","required":false,"type":"string"},{"name":"slug","required":false,"type":"string"},{"name":"currency","required":false,"type":"string"},{"name":"isActive","required":false,"type":"boolean"},{"name":"displayName","required":false,"type":"string|null"},{"name":"brandColor","required":false,"type":"string|null"},{"name":"allowedOrigins","required":false,"type":"string[]"},{"name":"timezone","required":false,"type":"string|null","description":"IANA timezone name (e.g. \"America/Los_Angeles\"). null resets to UTC. Applies to rendered surfaces only — API timestamps stay ISO 8601 UTC."},{"name":"quoteNumberPrefix","required":false,"type":"string"},{"name":"nextQuoteSeq","required":false,"type":"integer"},{"name":"orderNumberPrefix","required":false,"type":"string"},{"name":"nextOrderSeq","required":false,"type":"integer"}],"description":"Update application identity, branding, timezone, or document numbering (must be a workspace member). Timezone and numbering are per workspace environment."},{"method":"DELETE","path":"/api/v1/workspaces/{workspaceId}/applications/{applicationId}","pathParams":["workspaceId","applicationId"],"queryParams":[],"bodyFields":null,"description":"Delete an application (must be a workspace member)"},{"method":"GET","path":"/api/v1/billing/state","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/billing/subscribe","pathParams":[],"queryParams":[],"bodyFields":[{"name":"paymentMethodToken","required":false,"type":"string"}]},{"method":"POST","path":"/api/v1/billing/cancel","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/billing/resume","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/payment-methods","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/billing/payment-methods","pathParams":[],"queryParams":[],"bodyFields":[{"name":"paymentMethodToken","required":true,"type":"string"},{"name":"verificationTransactionId","required":false,"type":"string"}]},{"method":"PATCH","path":"/api/v1/billing/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":[{"name":"role","required":true,"type":"string","enum":["primary","backup"]}]},{"method":"DELETE","path":"/api/v1/billing/payment-methods/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/billing/gr4vy-embed-token","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/provider-status","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/invoices","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/invoices/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/invoices/{id}/receipt.pdf","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/plan-history","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/overview","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/billing/platform-revenue","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/platform-billing/run-renewal","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/platform-billing/run-dunning","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/extend-trial","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/promote-partner","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/partner-applications","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/partner-applications/{id}/reject","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/demote-partner","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/force-tier-override","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/refund-charge","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/cancel-immediately","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/bring-legacy-into-billing","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/suspend","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/workspaces/{id}/reactivate","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/audit-log","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/me/staff-status","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/staff","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/staff","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/admin/staff/{email}","pathParams":["email"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/payment-methods","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/invoices","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/usage","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/subscription-timeline","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/workspaces/{id}/members","pathParams":["id"],"queryParams":[],"bodyFields":null},{"method":"PATCH","path":"/api/v1/admin/workspaces/{id}/members/{memberId}","pathParams":["id","memberId"],"queryParams":[],"bodyFields":null},{"method":"DELETE","path":"/api/v1/admin/workspaces/{id}/members/{memberId}","pathParams":["id","memberId"],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/extensions/reviews","pathParams":[],"queryParams":[],"bodyFields":null},{"method":"GET","path":"/api/v1/admin/extensions/reviews/{sid}","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/claim","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/comments","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/install-candidate","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/uninstall-candidate","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/approve","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/request-changes","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/reviews/{sid}/reject","pathParams":["sid"],"queryParams":[],"bodyFields":null},{"method":"POST","path":"/api/v1/admin/extensions/{id}/unpublish","pathParams":["id"],"queryParams":[],"bodyFields":null}]}