docs
/
AppEngine API

Storefront and commerce

Catalog, cart, checkout, payments, orders, POS, inventory, pricing, discounts, returns, rentals and tax.

Ten controllers cover the whole commerce surface, from a public product listing to a point-of-sale tab to a rental deposit deduction. The datatypes are the sf_* family.

Catalog

GET/storefront/data/:siteIdNo auth
GET/storefront/productsJWT
GET/storefront/product/:idJWT
GET/storefront/product/:id/relatedJWT
GET/storefront/categoriesJWT
GET/storefront/collections/:collection?JWT
GET/storefront/brands/:brand?JWT
GET/storefront/attributes/:attribute?JWT

/storefront/data/:siteId is the public bootstrap call — one request that gives a storefront everything it needs to render.

/storefront/product/:id resolves by slug, not only by sk.

Datatypes: sf_product, sf_collection, sf_brand, sf_attribute, sf_price_list.

Cart

GET/storefront/cart/get/:authorid/:cartid?JWT
POST/storefront/cart/update/:cartidJWT
GET/storefront/cart/clear/:cartidJWT

Carts (sf_cart) are keyed by author, so a guest token from POST /profile/guest/auth is enough to hold one before sign-up.

Checkout

POST/storefront/checkout-cartJWT
POST/storefront/checkout-buy-nowJWT
POST/storefront/checkout-mixedJWT
POST/storefront/take-paymentJWT

checkout-buy-now skips the cart for a single item; checkout-mixed handles a basket combining one-off purchases with subscriptions or rentals.

Payments

GET/storefront/payment-gatewaysJWT
GET/storefront/verify-payment/:provider/:configId/:paymentIdJWT

Stripe:

POST/storefront/stripe/intentJWT
POST/storefront/stripe/captureJWT
POST/storefront/stripe/checkout-sessionJWT
POST/storefront/stripe/subscription-sessionJWT

Stripe Terminal, for card-present payments:

POST/storefront/stripe/terminal/connection-tokenJWT
POST/storefront/stripe/terminal/location/ensureJWT
POST/storefront/stripe/terminal/intentJWT

PayPal:

GET/storefront/paypal/configJWT

Orders

GET/storefront/order/get/:author/:orderNumberJWT
GET/storefront/orders/get/:authorJWT
GET/storefront/order/:idJWT
GET/storefront/order/:id/paymentsJWT
GET/storefront/order/email/:email/:orderNumberJWT

State transitions, each POST /storefront/order/<action>/:orderNumber:

ActionEffect
processAccepted, being prepared
shipHanded to a carrier
deliverDelivered
completeClosed
hold / releasePause and resume
cancelCancelled
refundRefunded
set-statusSet an arbitrary status
updateAmend order information

Also POST /storefront/order/:id/items to add items, POST /storefront/order/:id/fire to fire items to the kitchen or fulfillment, and GET /storefront/order/send-welcome/:orderNumber.

Order workflows:

POST/storefront/workflows/order-managementJWT
GET/storefront/workflows/order-management/:name?JWT

Point of sale

Tab-based POS, for hospitality as much as retail.

POST/storefront/pos/tabJWT
GET/storefront/pos/tabsJWT
GET/storefront/pos/tabs/closedJWT
POST/storefront/pos/tab/:id/settleJWT
POST/storefront/pos/tab/:id/splitJWT
POST/storefront/pos/tab/:id/refundJWT
GET/storefront/pos-categoriesJWT

Printing — payloads are separated from the print action, so a client can preview or route to a specific device:

POST/storefront/pos/tab/:id/print-checkJWT
POST/storefront/pos/tab/:id/print-receiptJWT
GET/storefront/pos/tab/:id/check-payloadJWT
GET/storefront/pos/tab/:id/receipt-payloadJWT
POST/storefront/pos/tab/:id/send-receiptJWT

Printing reaches physical hardware through hub-agent.

Service points — tables, chairs, bays:

POST/storefront/pos/tab/:id/assign-service-pointJWT
POST/storefront/pos/tab/:id/release-service-pointJWT
POST/storefront/service-point/:id/statusJWT

Inventory

Multi-location, with a reserve → fulfill lifecycle rather than a single quantity field.

GET/storefront/inventory/sku/:skuJWT
GET/storefront/inventory/sku/:sku/location/:locationIdJWT
GET/storefront/inventory/location/:locationIdJWT
POST/storefront/inventoryJWT
POST/storefront/inventory/adjustJWT
POST/storefront/inventory/reserveJWT
POST/storefront/inventory/releaseJWT
POST/storefront/inventory/fulfillJWT
POST/storefront/inventory/returnJWT
POST/storefront/inventory/countJWT
GET/storefront/inventory/sku/:sku/transactionsJWT
GET/storefront/inventory/alerts/low-stockJWT

Transfers between locations:

POST/storefront/inventory/transfersJWT
PUT/storefront/inventory/transfers/:transferId/shipJWT
PUT/storefront/inventory/transfers/:transferId/receiveJWT
PUT/storefront/inventory/transfers/:transferId/cancelJWT

Datatypes: sf_inventory, sf_inventory_intake, sf_inventory_transfer, location.

Pricing

POST/storefront/pricing/calculateJWT
POST/storefront/pricing/calculate-cartJWT
GET/storefront/pricing/product/:skuJWT
POST/storefront/pricing/price-listsJWT
GET/storefront/pricing/price-listsJWT
GET/storefront/pricing/customer-price-listsJWT
POST/storefront/pricing/preview-as-customerJWT

preview-as-customer resolves the price a specific customer would see — the fastest way to debug a tier or price-list rule. Tiers are sf_customer_tier.

Discounts

POST/storefront/discounts/validateJWT
POST/storefront/discounts/applyJWT
POST/storefront/discounts/calculateJWT
POST/storefront/discounts/automaticJWT
GET/storefront/discounts/promotions/activeJWT
POST/storefront/discountsJWT
PUT/storefront/discounts/:identifier/activateJWT
PUT/storefront/discounts/:identifier/deactivateJWT
POST/storefront/discounts/:identifier/usageJWT
POST/storefront/discounts/:identifier/reverseJWT

validate checks a code without consuming it; usage records a redemption and reverse undoes one when an order is cancelled.

Gift cards

GET/storefront/giftcards/balanceJWT
POST/storefront/giftcards/redeemJWT
POST/storefront/giftcardsJWT
POST/storefront/giftcards/batchJWT
POST/storefront/giftcards/transferJWT
PUT/storefront/giftcards/:serial/activateJWT
PUT/storefront/giftcards/:serial/suspendJWT
PUT/storefront/giftcards/:serial/reactivateJWT
PUT/storefront/giftcards/:serial/cancelJWT
POST/storefront/giftcards/:serial/refundJWT

Addressed by serial, not sk. batch issues a run of cards in one call.

Invoices

POST/storefront/invoices/saveJWT
GET/storefront/invoicesJWT
POST/storefront/invoices/:id/sendJWT
POST/storefront/invoices/:id/mark-paidJWT
POST/storefront/invoices/:id/mark-overdueJWT
POST/storefront/invoices/:id/reminderJWT
POST/storefront/invoices/:id/create-orderJWT
POST/storefront/invoices/:id/duplicateJWT
POST/storefront/invoices/:id/refundJWT
GET/storefront/invoices/:id/amount-dueJWT
GET/storefront/invoices/dashboard/metricsJWT

The customer payment page is public:

GET/storefront/invoices/pay/:idNo auth
POST/storefront/invoices/pay/:idNo auth

Returns

RMA-based, addressed by rmaNumber.

POST/storefront/returns/requestJWT
GET/storefront/returns/my-returnsJWT
GET/storefront/returns/rma/:rmaNumberJWT
PUT/storefront/returns/rma/:rmaNumber/shipJWT
PUT/storefront/returns/rma/:rmaNumber/cancelJWT

Operator side — PUT /storefront/returns/:rmaNumber/<action> for approve, reject, receive, inspect, complete, cancel, plus POST …/notes.

The rma/* paths are the customer's view of the same record; the bare :rmaNumber paths are the operator's.

Rentals

Full custody lifecycle with deposits.

GET/storefront/rental/itemsJWT
GET/storefront/rental/items/:sku/availabilityJWT
POST/storefront/rental/items/:sku/priceJWT
POST/storefront/rental/items/:sku/validate-restrictionsJWT
POST/storefront/rentalJWT
GET/storefront/rental/status/overdueJWT
GET/storefront/rental/status/due-todayJWT

State changes, PUT /storefront/rental/:rentalId/<action>: confirm, ready, checkout, picked-up, delivered, active, overdue, dropped-off, returned, checkin, complete, cancel, notes.

Deposits:

PUT/storefront/rental/:rentalId/deposit/holdJWT
PUT/storefront/rental/:rentalId/deposit/refundJWT
POST/storefront/rental/:rentalId/deposit/deductionJWT
POST/storefront/rental/:rentalId/paymentJWT

Datatypes: sf_rental, sf_rental_item, sf_rental_config.

Tax

POST/storefront/tax/calculateNo auth
POST/storefront/tax/rateJWT
POST/storefront/tax/productJWT
POST/storefront/tax/check-exemptJWT
POST/storefront/tax/apply-exemptionJWT
POST/storefront/tax/remove-exemptionJWT

Cart tax calculation is public so a storefront can show tax before the visitor signs in. Rates are sf_tax_rate.

Shipping

38 handlers under /shipping, backed by EasyPost and Google Places.

POST/shipping/ratesNo auth
POST/shipping/createJWT
GET/shipping/track/:trackingNumberJWT
POST/shipping/refresh-trackingJWT
POST/shipping/cancelJWT
GET/shipping/methodsJWT

Labels:

POST/shipping/labelJWT
GET/shipping/label/:shippingId/:format?JWT

Addresses:

POST/shipping/address-autocompleteJWT
GET/shipping/place-details/:placeIdJWT
POST/shipping/verify-addressJWT
POST/shipping/update-addressJWT

Order-scoped:

POST/shipping/order/ratesJWT
POST/shipping/order/createJWT
POST/shipping/order/manualJWT
GET/shipping/order/shipments/:orderNumberJWT
GET/shipping/order/status/:orderNumberJWT

Configuration, under /shipping/admin/*: providers, integrations, configs (CRUD plus set-default), per-product and bulk product shipping, preview-rate, calculate-packing, stats.

calculate-packing runs the box-packing algorithm — worth calling directly when a rate looks wrong.

Syndication

Push the catalog to shopping partners and social channels.

GET/storefront/sync/partnersJWT
POST/storefront/sync/:partner/:productIdJWT
POST/storefront/sync/all/:productIdJWT
POST/storefront/sync/add-productsJWT
GET/storefront/sync/products/:partnerJWT
POST/storefront/sync/post-to-socialJWT
POST/storefront/sync/preview-social-postJWT
GET/storefront/sync/social-targets/:platformJWT

For marketplace selling proper — Amazon, eBay, Etsy — see Sales channels.

Subscriptions

GET/storefront/subscriptions/get/:author/:subscriptionid?JWT
POST/storefront/update-subscriptionJWT

Datatypes: sf_subscription, sf_subscription_plan.