API reference
448 endpoints in 55 groups. Generated at build time from the same OpenAPI 3.1 document the API serves, so it always matches what the API validates.
Basics
- Base URL
https://api.shopfa.st/v1. Store endpoints start at/v1/store: the key or token already names its store. Each also works as/v1/stores/{storeId}/…. - Auth
Authorization: Bearer sk_…(keys) orsfo_…(OAuth) - OpenAPI /v1/openapi.json: import it into Postman, Insomnia or an SDK generator
- Lists cursor pagination; errors RFC 9457; limits 600 per minute per key
Groups
Store and team
Catalog
Stock and delivery
Orders
Customers and support
Marketing
Resellers
Storefront
Money and analytics
All endpoints
- GET/v1/storeStore settings
- PATCH/v1/storeUpdate store settings
- GET/v1/store/affiliate-programProgram settings and totals
- PUT/v1/store/affiliate-programCommission, cookie window, approval and payout rules
- GET/v1/store/affiliatesAffiliates with clicks, conversions and what you owe
- POST/v1/store/affiliatesAdd an affiliate (emailed their link)
- GET/v1/store/affiliates/{affiliateId}One affiliate with commissions and payouts
- PATCH/v1/store/affiliates/{affiliateId}Approve, pause or change an affiliate
- POST/v1/store/affiliates/{affiliateId}/payoutsPay every approved commission: from your ShopFast balance, or record a payment you made yourself
- GET/v1/store/analyticsKPIs, daily series, top products, methods, countries, funnel
- GET/v1/store/analytics/overviewHome KPIs, series, funnel and top lists for any date preset
- GET/v1/store/analytics/salesGross to net, refunds, disputes, methods and hours
- GET/v1/store/analytics/productsPer-product units, revenue, refunds and ratings
- GET/v1/store/analytics/customersNew and returning customers, lifetime value, top buyers
- GET/v1/store/analytics/trafficVisitors, the funnel, sources, referrers and landing pages
- GET/v1/store/analytics/campaignsUTM campaigns, promotions and affiliates
- GET/v1/store/analytics/exportOne analytics tab as CSV
- POST/v1/store/analytics/queryBreakdowns, pivots and time series over sessions, with filters, a segment and the period before
- POST/v1/store/analytics/query/exportThe same queries as CSV or JSON
- GET/v1/store/analytics/realtimeVisitors right now and the last 30 minutes
- GET/v1/store/analytics/pagesPages, landing and exit pages, time on page and scroll depth
- GET/v1/store/analytics/botsCrawler traffic: verified, declared, spoofed and suspicious, by bot
- GET/v1/store/analytics/attributionOrders credited to channels, sources and campaigns under six models
- GET/v1/store/analytics/cohortsCustomer cohorts by first order, retention and lifetime value
- GET/v1/store/analytics/product-conversionProduct views to cart to orders, per product and type
- GET/v1/store/analytics/adsAd spend with CPM, CPC, CPA and ROAS per campaign
- POST/v1/store/analytics/ads/spendAdd one day of spend for a campaign
- DELETE/v1/store/analytics/ads/spend/{spendId}Remove a spend row
- POST/v1/store/analytics/ads/importsImport spend from a CSV export of an ad platform
- DELETE/v1/store/analytics/ads/imports/{importId}Remove an import and its rows
- POST/v1/store/analytics/funnels/runRun a funnel definition over the period
- GET/v1/store/analytics/funnelsSaved funnels
- POST/v1/store/analytics/funnelsSave a funnel (from the builder or a template)
- PUT/v1/store/analytics/funnels/{funnelId}Change a saved funnel
- DELETE/v1/store/analytics/funnels/{funnelId}Delete a saved funnel
- GET/v1/store/analytics/segmentsSaved segments
- POST/v1/store/analytics/segmentsSave a segment
- PUT/v1/store/analytics/segments/{segmentId}Change a segment
- DELETE/v1/store/analytics/segments/{segmentId}Delete a segment
- GET/v1/store/analytics/annotationsChart notes (launches, campaigns, outages)
- POST/v1/store/analytics/annotationsAdd a chart note
- PUT/v1/store/analytics/annotations/{annotationId}Change a chart note
- DELETE/v1/store/analytics/annotations/{annotationId}Delete a chart note
- GET/v1/store/analytics/alertsAlert rules and what they found lately
- POST/v1/store/analytics/alertsAdd an alert (anomaly or threshold, emailed)
- PUT/v1/store/analytics/alerts/{alertId}Change an alert
- DELETE/v1/store/analytics/alerts/{alertId}Delete an alert
- POST/v1/store/analytics/alerts/{alertId}/checkEvaluate an alert now (emails only if it fires)
- GET/v1/store/analytics/reportsReports emailed on a schedule
- POST/v1/store/analytics/reportsSchedule a report
- PUT/v1/store/analytics/reports/{reportId}Change a scheduled report
- DELETE/v1/store/analytics/reports/{reportId}Stop a scheduled report
- POST/v1/store/analytics/reports/{reportId}/sendSend a scheduled report now
- GET/v1/store/analytics/sharesRead-only share links
- POST/v1/store/analytics/sharesCreate a signed, read-only link to a report
- DELETE/v1/store/analytics/shares/{shareId}Turn a share link off
- GET/v1/store/analytics/settingsTracking settings and pipeline health
- PUT/v1/store/analytics/settingsChange consent mode, sessions and bot filtering
- GET/v1/store/analytics/auto-renewRecurring revenue from auto-renewing subscriptions (MRR), retries and recoveries
- GET/v1/store/audit-logEvery change made in the store (dashboard and API keys), newest first (or by who, action or target)
- GET/v1/store/audit-log/exportThe filtered store audit log as CSV (up to 10,000 rows)
- GET/v1/store/audit-log/timelineEvery change to one product, order, role, member or setting, oldest first, with field-level differences
- GET/v1/store/audit-log/settingsHow long the audit log keeps entries and which sensitive changes raise alerts
- PUT/v1/store/audit-log/settingsChange the audit log retention and alerts (owner only)
- GET/v1/store/audit-log/export.jsonThe filtered store audit log as JSON lines with snapshots (up to 10,000 rows)
- GET/v1/store/balanceAvailable, pending, reserve and payouts
- GET/v1/store/balance/summaryYour ShopFast Pay balance by category: withdrawable, clearing, high-risk hold, reserve, chargeback holds and payouts on their way
- GET/v1/store/bundlesBundles with what they include and the savings
- POST/v1/store/bundlesCreate a bundle product
- PUT/v1/store/bundles/{productId}Update a bundle product
- GET/v1/store/categoriesEvery product category in tree order, with product counts (own and with subcategories)
- POST/v1/store/categoriesCreate a category, top-level or under a parent, optionally with products
- PATCH/v1/store/categories/{categoryId}Rename a category or change its handle (the old one redirects), description, image, SEO, sort or visibility
- DELETE/v1/store/categories/{categoryId}Delete a category: lift or delete its subcategories, file its products in the parent or take them out
- POST/v1/store/categories/{categoryId}/moveMove a category under another parent (or to the top level) and to a place among its siblings
- GET/v1/store/categories/{categoryId}/productsProducts filed directly in a category
- POST/v1/store/categories/{categoryId}/productsFile products in a category or take them out
- GET/v1/store/checkoutsCheckouts waiting for the buyer's own payment, abandoned ones, or ones still open at a provider
- GET/v1/store/checkouts/{sessionId}One checkout that is not an order: awaiting payment, abandoned or still open at a provider
- POST/v1/store/checkouts/{sessionId}/mark-paidManual methods: record that the buyer paid. Creates the order and starts delivery
- POST/v1/store/checkouts/{sessionId}/cancelClose a checkout that will not be paid (releases held stock, gift card balance and store credit). A buyer waiting to pay hears why
- GET/v1/store/collectionsCollections in storefront order
- POST/v1/store/collectionsCreate a collection
- PUT/v1/store/collections/{collectionId}Update a collection
- DELETE/v1/store/collections/{collectionId}Delete a collection
- POST/v1/store/collections/reorderSet the storefront order of collections
- POST/v1/store/collections/previewProducts an automatic collection would contain
- GET/v1/store/customersCustomers with spend, segments and tab counts
- GET/v1/store/customers/exportEvery customer matching the filters, as CSV
- GET/v1/store/customers/duplicatesPairs of customers that look like the same person
- GET/v1/store/customers/{customerId}A customer with orders, products, licenses, notes and emails
- PATCH/v1/store/customers/{customerId}Set a customer's tags
- PUT/v1/store/customers/{customerId}/blockBlock or unblock a customer from checking out
- POST/v1/store/customers/{customerId}/notesAdd a private note
- DELETE/v1/store/customers/{customerId}/notes/{noteId}Delete a note
- POST/v1/store/customers/{customerId}/mergeMerge another customer into this one: orders, reviews, notes, tags and emails move over
- GET/v1/store/customers/{customerId}/creditA customer's store credit balance and history
- POST/v1/store/customers/{customerId}/creditAdd or take off store credit
- GET/v1/store/customers/{customerId}/auto-renewA customer's subscriptions with auto-renew state
- GET/v1/store/discountsDiscount codes and automatic discounts with uses and revenue
- POST/v1/store/discountsCreate a discount
- PUT/v1/store/discounts/{discountId}Update a discount (orders already paid keep their discount)
- DELETE/v1/store/discounts/{discountId}Delete a discount that was never used (disable used ones)
- GET/v1/store/discounts/{discountId}/analyticsOrders, customers, revenue and a daily series for one discount
- POST/v1/store/discounts/bulk-deleteDelete the chosen discounts; ones already used in orders are disabled instead so their history stays
- GET/v1/store/discounts/{discountId}/codesA discount's generated codes with their uses
- POST/v1/store/discounts/{discountId}/codesGenerate unique codes for a discount (prefix, count, uses per code, optional email per code)
- PATCH/v1/store/discounts/{discountId}/codes/{code}Turn one generated code off or on
- GET/v1/store/discounts/{discountId}/codes/exportEvery generated code as CSV (code, uses, limit, email, status)
- GET/v1/store/discounts/{discountId}/reportOrders, revenue, conversion from entered to paid, top products and why codes did not apply
- GET/v1/store/discounts/{discountId}/usageThe usage log: every time the code was entered, rejected, redeemed or held, newest first (or by `sort`)
- GET/v1/store/discounts/{discountId}/usage/exportThe usage log as CSV (up to 20,000 rows)
- POST/v1/store/discounts/bulk-delete-queueQueue deleting discounts for 10 seconds (undo window), then delete like bulkDeleteDiscounts
- GET/v1/store/disputesChargebacks and buyer claims in one queue
- GET/v1/store/disputes/{disputeId}A dispute with its evidence, timeline and ledger effect
- PUT/v1/store/disputes/{disputeId}/evidenceSave the written part of the evidence
- POST/v1/store/disputes/{disputeId}/submitSend the evidence package to the processor
- POST/v1/store/disputes/{disputeId}/acceptAccept a chargeback (counts as lost)
- POST/v1/store/disputes/{disputeId}/replyReply to the buyer of a claim (emailed) or add a private note
- POST/v1/store/disputes/{disputeId}/resolveClose a claim: refund, replace or reject
- POST/v1/store/disputes/{disputeId}/simulate-outcomeSandbox disputes only: the processor decides the dispute
- POST/v1/store/disputes/{disputeId}/escalateAsk PayPal to decide an inquiry; it becomes a claim
- POST/v1/store/disputes/{disputeId}/refreshPull the case, its stage and its messages from PayPal again
- GET/v1/store/domainsCustom domains with their DNS records, verification and SSL status
- POST/v1/store/domainsConnect a domain (and optionally its www twin). Returns the one DNS record per hostname to add (plus one TXT record when another store connected the domain before)
- POST/v1/store/domains/{domainId}/checkLook at DNS and ask Cloudflare for the latest status now. A root domain and its www are checked together
- PUT/v1/store/domains/primaryChoose where buyers land. Every other address redirects there (null: the shopfa.st address)
- DELETE/v1/store/domains/{domainId}Disconnect a domain and release its certificate. A nameserver-mode domain loses its whole DNS zone at ShopFast
- GET/v1/store/domains/{domainId}/dns-recordsEvery record in a nameserver-mode domain's zone. ShopFast's storefront records are marked managed
- POST/v1/store/domains/{domainId}/dns-recordsAdd an MX, TXT, CNAME, A, AAAA, SRV or CAA record (DNS only, never proxied)
- PUT/v1/store/domains/{domainId}/dns-records/{recordId}Replace one of your records. Managed storefront records cannot be changed
- DELETE/v1/store/domains/{domainId}/dns-records/{recordId}Delete one of your records. Managed storefront records cannot be deleted
- GET/v1/store/emailsTransactional email templates with branding and 30-day send counts
- PUT/v1/store/emails/{kind}Save a template (unknown variables are rejected)
- DELETE/v1/store/emails/{kind}Go back to the ShopFast default
- POST/v1/store/emails/{kind}/testSend the template (or unsaved edits) with sample values to your own email
- GET/v1/store/emails/{kind}/documentA transactional email as blocks, with its typed variables and preview data
- PUT/v1/store/emails/{kind}/documentSave a transactional email built with blocks (keeps a version)
- POST/v1/store/emails/{kind}/document/testSend yourself a test with sample data (rendered on the server exactly as buyers get it)
- POST/v1/store/emails/renderThe server render of a document (email HTML and text) with sample data
- GET/v1/store/feesThe store's plan, effective fees after any override, settlement rules and processor estimate (set by ShopFast)
- GET/v1/store/financials/statementGross to net earnings for a period, per currency, tied out to the ledger
- GET/v1/store/financials/monthlyOne statement row per month
- GET/v1/store/financials/payoutsPayouts matched to their ledger journals, and the balance roll-forward
- GET/v1/store/financials/taxTax collected and refunded by buyer country
- GET/v1/store/financials/exportA statement, the months, payouts, tax or the raw ledger as CSV
- GET/v1/store/gatewaysSeller's own connected gateways
- POST/v1/store/gatewaysConnect an own gateway (sandbox connects instantly; real providers return an onboarding URL). Calling it again resumes onboarding or picks up a finished one. Provider shopfast_pay sets up the account ShopFast pays merchant-of-record payouts to. A store set to ShopFast Pay that ShopFast Pay cannot serve moves to its own gateways once the connection can take payments.
- GET/v1/store/gateways/manualManual payment methods (own gateway stores)
- POST/v1/store/gateways/manualAdd a manual payment method (an enabled one moves a store ShopFast Pay cannot serve to its own gateways)
- PUT/v1/store/gateways/manual/{methodId}Change a manual payment method
- DELETE/v1/store/gateways/manual/{methodId}Remove a manual payment method (checkouts already waiting keep their instructions)
- POST/v1/store/gateways/btcpayConnect the seller's BTCPay Server store: checks the key and registers ShopFast's webhook
- POST/v1/store/gateways/{provider}/keysConnect a gateway with the seller's own API keys: checks them with the provider, sets up payment events and seals them. A store set to ShopFast Pay that ShopFast Pay cannot serve moves to its own gateways
- POST/v1/store/gateways/{provider}/settingsChange a connected gateway's optional settings without reconnecting (Stripe: the publishable key and the payment method configuration): checked with the provider, sealed with the keys
- POST/v1/store/gateways/{provider}/options/refreshRead the ways to pay the seller turned on at the provider again (Stripe's payment method configuration) and offer them at checkout
- GET/v1/store/gateways/shopify/authorizeShopify's page where the seller approves their own app (after connecting its keys). Its state works 15 minutes, for this store and member
- POST/v1/store/gateways/shopify/callbackFinish connecting Shopify with the query Shopify sent to /settings/payments/shopify: checks it, takes the app's token and adds ShopFast's webhooks
- DELETE/v1/store/gateways/{provider}Disconnect a gateway: new checkouts stop using it; paid orders and refunds keep working where the provider allows
- GET/v1/store/gateways/gift-codesGift cards: the cards the store takes (the defaults until the first save) and how many codes wait for review
- PUT/v1/store/gateways/gift-codesGift cards: save the cards, their values, pictures and Eneba and G2A links (links are checked)
- GET/v1/store/gift-cardsGift cards with balances
- POST/v1/store/gift-cardsIssue a gift card. The full code is returned once, here
- GET/v1/store/gift-cards/{giftCardId}A gift card and its history
- PATCH/v1/store/gift-cards/{giftCardId}Adjust the balance, disable or re-enable, or change the expiry
- DELETE/v1/store/gift-cards/{giftCardId}Delete a gift card that was never used (disable used ones so their history stays)
- PUT/v1/store/gift-cards/{giftCardId}/expirySet or clear (null) the expiry date
- POST/v1/store/gift-cards/{giftCardId}/shareA signed link to the gift card page on the storefront (shows the balance; applies the card to the cart)
- GET/v1/store/gift-cards/productsProducts that sell gift cards
- POST/v1/store/gift-cards/productsCreate a product that sells gift cards (one option per amount). Each unit bought issues a card
- GET/v1/store/inventoryStock for every product and option, with key pool health
- POST/v1/store/inventory/adjustChange a counted stock and record why
- GET/v1/store/inventory/historyEvery stock change, newest first
- GET/v1/store/invoicesInvoices and credit notes issued to buyers, newest first, with totals per currency
- GET/v1/store/invoices/{invoiceId}One invoice or credit note as issued
- GET/v1/store/invoices/{invoiceId}/downloadA link to the PDF or the UBL 2.1 (EN 16931) XML
- GET/v1/store/licensesSold keys with their state, devices and expiry. `q` matches an exact key, an email, an order number or a key id
- GET/v1/store/licenses/{licenseId}One key: devices, history and limits
- POST/v1/store/licenses/{licenseId}/actionsRevoke, restore, suspend, resume, add time, start the clock, release or reset devices, or change the device limit
- GET/v1/store/offersAdd-on and upsell rules with 30-day conversions
- POST/v1/store/offersWhen product X is in the cart, offer Y at Z
- PUT/v1/store/offers/{ruleId}Update an offer rule
- DELETE/v1/store/offers/{ruleId}Delete an offer rule
- POST/v1/store/offers/reorderSet which offer shows first when several match
- GET/v1/store/onboardingGet started checklist
- GET/v1/store/ordersOrders with tab counts
- GET/v1/store/orders/{orderId}Order with fee breakdown and fulfillment timeline
- POST/v1/store/orders/{orderId}/refundRefund in full
- POST/v1/store/orders/{orderId}/review-requestEmail the buyer a review request now
- POST/v1/store/orders/{orderId}/simulate-disputeSandbox and test orders only: the processor opens a chargeback (signed webhook through the real pipeline)
- GET/v1/store/orders/statsOrders and revenue per status for today, 7 days, 4 weeks or all time (KPI cards)
- GET/v1/store/orders/exportEvery order matching the tab, search and filters, as CSV or JSON (up to 10,000 rows)
- POST/v1/store/orders/{orderId}/refundsRefund part or all of what is left, to the payment method or to store credit. Idempotent per key
- POST/v1/store/orders/{orderId}/notesAdd a private note to an order
- DELETE/v1/store/orders/{orderId}/notes/{noteId}Delete a note
- PUT/v1/store/orders/{orderId}/blockBlock or unblock the buyer's email and/or checkout IP (the store's fraud blocklist)
- POST/v1/store/orders/{orderId}/replace-keysRevoke delivered keys and deliver fresh ones from the pool (the buyer is emailed the new keys)
- POST/v1/store/orders/{orderId}/resend-deliveryEmail the buyer their receipt again, with their license keys and fresh download links (3 per order per hour)
- POST/v1/store/orders/{orderId}/retry-deliveryPut failed delivery steps back in the queue and run fulfillment again
- POST/v1/store/orders/{orderId}/mark-paidComplete an order that is waiting for a manual payment (your own gateway or a test order): runs delivery like a gateway payment
- POST/v1/store/orders/{orderId}/release-holdDeliver an order that was held for review
- GET/v1/store/orders/{orderId}/refund-offerThe order’s open (or latest) refund offer and the store’s credit refund settings
- POST/v1/store/orders/{orderId}/refund-offerOffer the buyer a refund they take as store credit with the bonus or as money back (emailed; shown on their order page)
- POST/v1/store/orders/{orderId}/refund-offer/{offerId}/cancelWithdraw an offer the buyer has not answered
- POST/v1/store/orders/{orderId}/refunds/queueQueue a refund for 10 seconds (undo window), then send it like createOrderRefund
- GET/v1/store/orders/{orderId}/auto-renewSubscriptions this order started or renewed, with auto-renew state, charges and the audit trail
- GET/v1/store/orders/{orderId}/invoicesThe order's invoice and credit notes
- GET/v1/store/pagesCustom pages and policies
- POST/v1/store/pagesCreate a page (body is sanitized)
- PUT/v1/store/pages/{pageId}Update a page
- DELETE/v1/store/pages/{pageId}Delete a page
- PUT/v1/store/payment-modelChoose merchant of record or own gateway (must be allowed by the plan)
- GET/v1/store/payments/overviewEvery way the store can get paid: ShopFast Pay status, gateways, manual methods, plugins, health, order and rules
- GET/v1/store/payments/shopfast-payShopFast Pay for this store: the platform mode, the application, limits, reserve and payout hold
- PUT/v1/store/payments/rulesThe order buyers see ways to pay in, and per-method country and order total rules
- PUT/v1/store/payments/test-modeTurn store-wide test mode on for a few hours (checkouts run on simulated payments and are marked test) or off
- PUT/v1/store/payments/shopfast-pay/applicationSave the ShopFast Pay application as a draft (starts one when there is none)
- POST/v1/store/payments/shopfast-pay/application/documentsAttach a finished upload (purpose file: PDF, PNG, JPEG or WebP up to 15 MB) to the application
- DELETE/v1/store/payments/shopfast-pay/application/documents/{documentId}Remove a document from an application that is still open
- POST/v1/store/payments/shopfast-pay/application/submitOwner only: send the application to ShopFast for review (or turn ShopFast Pay on at once when it is open to all)
- POST/v1/store/payments/shopfast-pay/application/replyAnswer the reviewer's question; the application goes back into review
- POST/v1/store/payments/shopfast-pay/application/withdrawWithdraw an open application
- GET/v1/store/payments/limitsOrder limits per payment method: yours, ShopFast's caps for your currency and what checkout enforces
- PUT/v1/store/payments/limitsSet the smallest and largest order each kind of payment takes, and the card limit for first orders (clamped to ShopFast's caps)
- POST/v1/store/payoutsWithdraw: a payout request from the withdrawable balance to the payout wallet, reviewed and sent by ShopFast
- GET/v1/store/popupsPopup offers with impressions and conversions per variant (last 30 days)
- POST/v1/store/popupsCreate a popup offer
- GET/v1/store/popups/{popupId}One popup with its daily series and recent email signups
- PUT/v1/store/popups/{popupId}Save a popup offer
- DELETE/v1/store/popups/{popupId}Delete a popup with its stats (email signups stay in the export until then)
- POST/v1/store/popups/{popupId}/statusPublish, pause or archive a popup
- POST/v1/store/popups/{popupId}/duplicateCopy a popup as a draft
- GET/v1/store/popups/{popupId}/leads/exportEmail signups of a popup as CSV, with consent and the code each got
- GET/v1/store/product-presetsShopFast's product presets (with this store's edits) and the store's own presets
- POST/v1/store/product-presetsSave a preset of your own
- PUT/v1/store/product-presets/{presetKey}Edit a preset (a built-in one becomes your store's copy)
- DELETE/v1/store/product-presets/{presetKey}Delete your preset, or bring a built-in one back to ShopFast's version
- POST/v1/store/product-presets/{presetKey}/defaultMake it the preset "New product" opens with (or stop)
- POST/v1/store/product-presets/{presetKey}/bulkCreate one product per game from a preset (5 games × 4 durations in one go)
- GET/v1/store/product-slugsIs this slug free in the store? Suggests the next free one
- GET/v1/store/product-statusesEvery product with its game and live status badge (the status board)
- PATCH/v1/store/product-statusesChange live status badges (Working, Updating, Not working) of several products at once
- GET/v1/store/productsProducts with tab counts
- POST/v1/store/productsCreate a product
- GET/v1/store/products/{productId}One product
- PATCH/v1/store/products/{productId}Update a product
- DELETE/v1/store/products/{productId}Delete a product (soft: orders keep it, it can be restored, its slug is freed)
- GET/v1/store/products/{productId}/keysKeys in the pool, with who each assigned key went to
- POST/v1/store/products/{productId}/keysAdd license keys or serials to a product pool (duplicates are skipped)
- PUT/v1/store/products/{productId}/templatePick the theme template a product page uses (null: the default product template)
- GET/v1/store/products/{productId}/fullEverything the product editor shows: variants, media, files, delivery, checkout fields, SEO and relations
- PUT/v1/store/products/{productId}/fullSave the whole editor document. 409 when someone else saved since baseUpdatedAt
- POST/v1/store/products/fullCreate a product from the editor (description sanitized, slug unique per store)
- GET/v1/store/products/{productId}/last-editWho last changed a product and when, and how many sales changed its stock since a time (the editor explains a save conflict with it)
- POST/v1/store/products/{productId}/duplicateCopy a product as a draft (variants, media, files, settings; not keys or sales)
- POST/v1/store/products/{productId}/restoreRestore a deleted product as a draft
- POST/v1/store/products/bulkApply one action to many products
- GET/v1/store/products/exportEvery product as CSV (PRODUCT_CSV_COLUMNS)
- POST/v1/store/products/importCreate or update products from CSV (matched by slug). dryRun validates without writing; any error writes nothing
- GET/v1/store/products/deletedRecently deleted products that can be restored
- GET/v1/store/products/{productId}/delivery-webhook/secretThe signing secret for this product's delivery URL (Standard Webhooks)
- POST/v1/store/products/{productId}/delivery-webhook/rotateReplace the signing secret; the old one stops verifying at once
- POST/v1/store/products/{productId}/delivery-webhook/testCall a delivery URL with a signed sample order and show what buyers would get
- GET/v1/store/products/{productId}/subscribersSubscriptions to this product: state, period end and renewals
- POST/v1/store/products/{productId}/subscribers/{subscriptionId}/cancelCancel a subscription now (access ends and Discord roles come off) or at the period end
- GET/v1/store/products/{productId}/files/{fileId}/downloadA short-lived link for the seller to download the current version of a deliverable
- POST/v1/store/products/{productId}/keys/importImport keys or serials from pasted text or CSV: format check, duplicates skipped, optionally reserved for one option
- GET/v1/store/products/{productId}/keys/exportKeys as CSV (value, status, option, order, assigned at)
- POST/v1/store/products/{productId}/keys/removeRemove unused keys from the pool (assigned keys are never removed)
- POST/v1/store/products/{productId}/moveMove a product in the order the storefront lists products (or in a hand-picked collection): first, last, or next to another product
- POST/v1/store/products/{productId}/keys/{keyId}/revealShow one license key in full
- GET/v1/store/products/{productId}/licensingA product’s licensing: API keys, device binding, expiry clock, auto-pause and linked status
- PUT/v1/store/products/{productId}/licensingSave a product’s licensing settings (turning the API on mints its keys)
- POST/v1/store/products/{productId}/licensing/rotateReplace the product’s publishable key or its signing key (old ones stop working at once)
- GET/v1/store/products/{productId}/replacement-policyA product’s self-serve replacement policy (window, limit, reason and proof, automatic or reviewed) and its queue numbers
- PUT/v1/store/products/{productId}/replacement-policySave a product’s self-serve replacement policy
- POST/v1/store/products/{productId}/broadcasts/audienceWho owns the product and who each channel would reach with these filters (consent applied)
- POST/v1/store/products/{productId}/broadcastsPost an update to owners: adds the version to the history, attaches the new file version and sends in the background
- POST/v1/store/products/{productId}/broadcasts/testSend the update email to yourself with sample values
- GET/v1/store/products/{productId}/watermarkWhether the product’s downloads are marked per buyer, and how
- PUT/v1/store/products/{productId}/watermarkTurn per-buyer watermarks on or off for PDFs, images, ZIP archives and text files
- GET/v1/store/products/{productId}/update-supportPay what you want for updates (owners chip in) and for renewals (Extend at a price the buyer picks)
- PUT/v1/store/products/{productId}/update-supportSave pay what you want for updates and renewals
- GET/v1/store/products/{productId}/telegram-accessThe Telegram group or channel this product invites buyers to, and how long access lasts
- PUT/v1/store/products/{productId}/telegram-accessSave Telegram access for a product (the bot must be an admin of the chat who can invite and remove members)
- POST/v1/store/products/{productId}/broadcasts/queueQueue a product update for 10 seconds (undo window), then post it like sendBroadcast
- POST/v1/store/products/bulk-delete-queueQueue deleting products for 10 seconds (undo window)
- GET/v1/store/products/{productId}/statusThe product's one status: badge, label, note (the open incident's title while one is open) and auto-pause
- GET/v1/store/products/{productId}/auto-renewAuto-renew for one product: whether buyers can opt in, the dunning schedule and who renews
- PUT/v1/store/products/{productId}/auto-renewAllow auto-renew on a subscription or duration product and set its retry days
- GET/v1/store/promotionsSale campaigns with results
- POST/v1/store/promotionsSchedule a sale
- PUT/v1/store/promotions/{promotionId}Change a sale
- DELETE/v1/store/promotions/{promotionId}Delete a draft or scheduled sale
- POST/v1/store/promotions/{promotionId}/endEnd a running sale now
- GET/v1/store/replacementsReplacement requests from buyers: waiting for review, approved (automatic or by a teammate) and rejected
- POST/v1/store/replacements/{requestId}/decideApprove (a fresh key from the same pool replaces the old one, which is revoked) or reject a replacement request
- GET/v1/store/resell-partnersStore-to-store resell requests you received or sent, with units supplied and money moved
- POST/v1/store/resell-partnersAsk another store to let you resell its products at a discount
- GET/v1/store/resell-partners/supplierA store by its address and the key and serial products it can supply
- POST/v1/store/resell-partners/{partnershipId}/decisionAccept or reject a request (supplier), cancel it (reseller), or end a partnership (either side)
- POST/v1/store/resell-partners/{partnershipId}/listingsList a supplier's product in your store at your price (keys come from the supplier)
- GET/v1/store/reseller-ordersBulk orders from resellers
- POST/v1/store/reseller-orders/{resellerOrderId}/cancelCancel an unpaid bulk order
- GET/v1/store/reseller-programWholesale settings, tiers and the application link
- PUT/v1/store/reseller-programTurn wholesale on or off and edit the pitch
- POST/v1/store/reseller-tiersAdd a pricing tier
- PUT/v1/store/reseller-tiers/{tierId}Change a pricing tier
- DELETE/v1/store/reseller-tiers/{tierId}Delete a tier nobody is on
- GET/v1/store/resellersReseller accounts and applications
- POST/v1/store/resellersAdd an approved reseller (emailed their portal link)
- POST/v1/store/resellers/{resellerId}/reviewApprove, reject, suspend or reinstate a reseller
- PATCH/v1/store/resellers/{resellerId}Move a reseller to another tier
- POST/v1/store/resellers/{resellerId}/ordersCreate a bulk order at the tier price and get its pay link
- GET/v1/store/resellers/{resellerId}/apiA reseller's API keys, webhook, recent calls and webhook deliveries
- POST/v1/store/resellers/{resellerId}/api/keys/{keyId}/revokeRevoke a reseller's API key
- GET/v1/store/review-settingsReview requests and moderation rules
- PUT/v1/store/review-settingsUpdate review requests and moderation rules
- GET/v1/store/reviewsThe moderation queue with counts and the rating summary
- POST/v1/store/reviews/{reviewId}/moderateApprove, hide, flag or unflag a review
- PUT/v1/store/reviews/{reviewId}/replyReply in public (null removes the reply)
- GET/v1/store/sales-pausesSales paused by linked status (open and past), with the downtime credited to keys
- GET/v1/store/search/settingsSynonyms, pinned results, redirects and the state of the search index
- POST/v1/store/search/synonymsAdd a synonym rule
- PUT/v1/store/search/synonyms/{synonymId}Change a synonym rule
- DELETE/v1/store/search/synonyms/{synonymId}Remove a synonym rule
- POST/v1/store/search/rulesPin products to a search, or send a search to a page
- PUT/v1/store/search/rules/{ruleId}Change a pin or redirect
- DELETE/v1/store/search/rules/{ruleId}Remove a pin or redirect
- POST/v1/store/search/reindexRebuild the search index now (it also refreshes itself after catalog changes)
- GET/v1/store/search/previewWhat buyers get for a search (synonyms, typos, pins and redirects applied), not counted in analytics
- GET/v1/store/search/analyticsTop searches, searches with no results, click-through and searches that led to a purchase
- GET/v1/store/securityFraud rules, blocklist and recent checkout checks
- PUT/v1/store/security/settingsVPN policy, IP velocity limit, risk thresholds and email rules
- POST/v1/store/security/blocklistBlock emails, email domains, IPs, IP ranges or countries (values are normalized; duplicates skipped)
- DELETE/v1/store/security/blocklist/{entryId}Unblock one entry
- POST/v1/store/security/testRun the fraud rules on a pretend checkout (logged as a test, never counted toward limits)
- GET/v1/store/seoStore-level search and social settings, plus sitemap and feed links
- PUT/v1/store/seoSave store-level search and social settings
- GET/v1/store/settings/generalStore profile, branding, status, locale and legal details
- PATCH/v1/store/settings/generalUpdate the store profile, brand color, storefront status, time zone, currency display or legal details
- GET/v1/store/settings/handleIs a store address free?
- PUT/v1/store/settings/handleChange the store address; the old address keeps redirecting
- POST/v1/store/settings/assetsUse a finished image upload as the logo or favicon
- DELETE/v1/store/settings/assets/{kind}Remove the logo or favicon
- GET/v1/store/settings/notificationsWhich events reach whom, the Discord and Telegram channels and recent deliveries
- GET/v1/store/settings/notifications/deliveriesAlerts and tests ShopFast sent for this store, newest first (or by alert, channel, recipient or status)
- PUT/v1/store/settings/notifications/rulesSave the event × channel toggles and which team members get team emails
- PUT/v1/store/settings/notifications/channelConnect or clear the Discord webhook or the Telegram bot (secrets are encrypted and never sent back)
- POST/v1/store/settings/notifications/testSend a test notification to one channel
- GET/v1/store/settings/integrationsAnalytics, chat and review apps, Telegram, Discord and outgoing webhooks
- PUT/v1/store/settings/integrationsSave the storefront integration ids (each checked against a strict pattern)
- GET/v1/store/storefront/preview-dataWhat the editor previews with: the page it shows plus a sample of the catalog (never all of it), the shop context and the storefront origin
- POST/v1/store/storefront/preview-data/pagePage data for the editor preview: products by handle or id and collection slices, from the same source storefront renders read
- GET/v1/store/storefront/feedsProduct feed URLs and per-product eligibility and issues
- GET/v1/store/storefront/newsletterEmails collected by newsletter sections, newest first
- GET/v1/store/storefront/checkout-settingsCart drawer and checkout customization
- PUT/v1/store/storefront/checkout-settingsSave the checkout settings
- PUT/v1/store/storefront/cart-settingsSave the cart drawer settings
- GET/v1/store/storefront/passwordWhether the storefront is password protected, if a password is set, and the message buyers see
- PUT/v1/store/storefront/passwordTurn password protection on or off, set a new password (stored as a hash) and the message buyers see
- GET/v1/store/storefront/socialSocial links of the store and where templates show them (header, footer or both), shared by every template
- PUT/v1/store/storefront/socialReplace the social links (in order) and where they show; every template picks them up at once
- GET/v1/store/support/ticketsTickets in a view (open, mine, unassigned, waiting, breached, solved, all) with search and filters
- POST/v1/store/support/ticketsOpen a ticket on behalf of a buyer (emails them unless notify is off)
- GET/v1/store/support/unreadOpen tickets with a buyer message you have not opened or answered yet (the Support badge)
- GET/v1/store/support/tickets/{ticketId}One ticket: messages, notes, timeline, attachments (signed links) and the customer context
- PATCH/v1/store/support/tickets/{ticketId}Change status, priority, assignee, tags, category, subject or the linked order
- POST/v1/store/support/tickets/{ticketId}/messagesReply to the buyer (emailed, threaded) or add an internal note; optionally set the status in the same step
- POST/v1/store/support/tickets/bulkApply one change to many tickets (close, assign, tag, prioritize)
- POST/v1/store/support/tickets/{ticketId}/mergeMerge other tickets from the same buyer into this one (their messages move here; they close)
- POST/v1/store/support/tickets/{ticketId}/presenceI am viewing (or typing in) this ticket; answers who else is
- POST/v1/store/support/attachmentsA signed upload link for a reply attachment (size and type limits apply)
- POST/v1/store/support/attachments/{attachmentId}/completeCheck the uploaded bytes (real type, size) and make the attachment usable
- GET/v1/store/support/cannedSaved replies with variables
- POST/v1/store/support/cannedSave a reply
- PUT/v1/store/support/canned/{cannedId}Edit a saved reply
- DELETE/v1/store/support/canned/{cannedId}Delete a saved reply
- POST/v1/store/support/canned/{cannedId}/fillA saved reply with its variables filled for one ticket
- GET/v1/store/support/settingsSupport settings: categories, SLA targets, widget, email replies, auto-close and satisfaction
- PUT/v1/store/support/settingsSave support settings
- GET/v1/store/support/reportFirst response and resolution times, SLA, satisfaction, volume, categories and agents
- GET/v1/store/teamMembers, pending invites, custom roles and your own access
- POST/v1/store/team/invitesInvite someone by email. The link works for 7 days.
- POST/v1/store/team/invites/{inviteId}/resendSend the invite again with a new link and a fresh 7 days
- DELETE/v1/store/team/invites/{inviteId}Cancel a pending invite
- PUT/v1/store/team/members/{userId}/roleChange a member's role (the owner's role changes only through a transfer)
- PUT/v1/store/team/members/{userId}/aiTurn Use AI on or off for a teammate (Ask AI, the AI builder and theme AI spend the store's AI credits). Only the owner
- DELETE/v1/store/team/members/{userId}Remove someone from the team and end their access at once
- POST/v1/store/team/leaveLeave this store (owners transfer ownership first)
- POST/v1/store/team/transferOwner only: make another member the owner. You become an admin.
- POST/v1/store/team/rolesCreate a custom role from the permission matrix
- PUT/v1/store/team/roles/{roleId}Edit a custom role. Members with it get the new permissions on their next request.
- DELETE/v1/store/team/roles/{roleId}Delete a custom role nobody has
- GET/v1/store/team/accessAccess policies, member attributes and the team's two-factor and invite settings
- POST/v1/store/team/policiesAdd an access policy (allow policies are owner-only)
- PUT/v1/store/team/policies/{policyId}Change an access policy
- DELETE/v1/store/team/policies/{policyId}Delete an access policy
- POST/v1/store/team/simulateWhat a member (or a role) could do, here and now or in a given context, with every policy explained
- PUT/v1/store/team/access-settingsWhich roles need two-factor sign-in, and how long invite links work
- PUT/v1/store/team/members/{userId}/attributesSet a teammate's department and tags (used by access policies)
- POST/v1/store/team/invites/bulkInvite up to 200 people at once, each with a role and the same attributes
- POST/v1/store/test-saleGet started: run a full test order through checkout, webhook, fulfillment and ledger
- GET/v1/store/themesInstalled themes, the stock theme library and which version is live
- POST/v1/store/themesInstall a stock theme (with a style) or duplicate an installed one, unpublished
- GET/v1/store/themes/{themeId}The draft: every file, its revision and validation results
- PATCH/v1/store/themes/{themeId}Rename a theme
- DELETE/v1/store/themes/{themeId}Delete an unpublished theme
- POST/v1/store/themes/{themeId}/opsApply typed edits to the draft (all or nothing). 409 when baseRevision is not the current revision
- POST/v1/store/themes/{themeId}/publishValidate strictly, compile CSS, freeze the draft into a version and make the theme live
- POST/v1/store/themes/{themeId}/discardReset the draft to the latest published version
- GET/v1/store/themes/{themeId}/versionsPublished versions, newest first
- GET/v1/store/themes/{themeId}/versions/{versionId}One published version with its files
- POST/v1/store/themes/{themeId}/versions/{versionId}/restoreRoll back: copy a version into the draft, and publish it again when asked
- GET/v1/store/themes/{themeId}/revisionsDraft history with authors and AI prompts
- POST/v1/store/themes/{themeId}/aiAsk AI for a change. Returns validated ops to preview; nothing is saved until the seller applies them
- GET/v1/store/themes/{themeId}/ai/historyYour AI requests for this theme, newest first: what you asked (with images), the answer and what you did with it
- POST/v1/store/themes/{themeId}/preview-linkA signed, expiring link that shows this draft on the real storefront (noindex), opening `path` (the page being edited)
- GET/v1/store/themes/{themeId}/assetsImages uploaded into a theme
- POST/v1/store/themes/{themeId}/assetsAdd a completed image upload to a theme (the editor then writes config/assets.json in the draft)
- DELETE/v1/store/themes/{themeId}/assets/{assetId}Remove an image from a theme. Published versions that use it keep working.
- GET/v1/store/themes/{themeId}/updateWhether a newer stock version exists, and what merging it into this theme's draft or live version would change
- POST/v1/store/themes/{themeId}/updateTake the newest stock version, the way the seller chose: into the draft, as a new unpublished theme, or live (published at once)
- POST/v1/store/themes/{themeId}/sharesExport a theme or one template as a share code (and the package file behind it)
- DELETE/v1/store/themes/{themeId}/shares/{code}Revoke a share code before it expires
- GET/v1/store/themes/{themeId}/templatesEvery template in a theme draft, with how many products, collections and pages use each alternate
- POST/v1/store/themes/{themeId}/templatesCreate an alternate template (templates/<type>.<suffix>.json) from the default template or by duplicating another
- POST/v1/store/themes/{themeId}/templates/renameRename an alternate template. 409 while products, collections or pages use it, unless reassign moves them along
- POST/v1/store/themes/{themeId}/templates/deleteDelete an alternate template. 409 (with who uses it) while products, collections or pages are assigned to it
- GET/v1/store/themes/{themeId}/libraryEvery section the theme can add, with its variants and the metadata the "Add section" library filters on
- GET/v1/store/themes/{themeId}/update/renderA page of this theme rendered before (the draft) or after (the draft with the stock update merged), for What's-new previews
- POST/v1/store/themes/{themeId}/versions/{versionId}/answerKeep a version ShopFast published without asking, or restore the version before it (live at once; the draft too, when untouched since)
- POST/v1/store/themes/{themeId}/ai/copyRegenerate a section's copy, rewrite it in the seller's tone, or translate it. Returns validated ops to preview
- POST/v1/store/uploadsGet a short-lived signed URL to PUT one file to (images for the gallery, private deliverables)
- POST/v1/store/uploads/{uploadId}/completeCheck the uploaded bytes (size, real file type, image dimensions) and make the upload usable
- GET/v1/store/webhooks/endpointsWebhook endpoints with their health
- POST/v1/store/webhooks/endpointsAdd an endpoint. The signing secret is in the response
- PATCH/v1/store/webhooks/endpoints/{endpointId}Change the URL, events or description, or turn it on or off
- DELETE/v1/store/webhooks/endpoints/{endpointId}Delete an endpoint and its pending deliveries
- POST/v1/store/webhooks/endpoints/{endpointId}/secretShow the current signing secret (store owners only)
- POST/v1/store/webhooks/endpoints/{endpointId}/rotateReplace the signing secret. The old one keeps signing alongside the new one for the overlap
- POST/v1/store/webhooks/endpoints/{endpointId}/testSend a signed webhook.test event to this endpoint now
- GET/v1/store/webhooks/deliveriesThe delivery log, newest first (or sorted by any column)
- GET/v1/store/webhooks/deliveries/{deliveryId}One delivery: the signed request and every attempt with its response
- POST/v1/store/webhooks/deliveries/{deliveryId}/replaySend the same event again as a new delivery
- GET/v1/store/webhooks/eventsEvents sent to your endpoints, newest first (or sorted by type, deliveries or id)
- GET/v1/store/webhooks/events/{eventId}One event: the exact signed body and where it went
- POST/v1/store/webhooks/events/{eventId}/resendSend the event again to one endpoint, or to every endpoint subscribed to its type