expectedTotal set to that quote’s total. Pricing lives in Postgres as a Port cart — not in this API’s memory — and expires in 60 seconds.
Quotes and execute require an Admin API key (
stytch_admin). Payment
methods, payout methods, and trading status use Member access
(stytch_member). Every execution route is also gated by an organization
allowlist — 403 if your org is not allowlisted. See
Authentication.How a quote works
POST /execution/v2/{buy|sell}/quotes creates a cart in the database and returns a pricing snapshot: quoteId, lineItems, fees, optionals, subtotal, total, and expiresAt.
That quoteId is the cart UUID. Refresh, optionals, and execute all load the same cart. After 60 seconds the cart row can still exist, but the price is no longer valid until you refresh or create a new quote.
Execute re-prices from live listings and offers, then checks expectedTotal:
- Buy — reject if the live charge went up (ceiling)
- Sell — reject if the live payout went down (floor)
expectedTotal is a bound, not a frozen fill. Field-by-field schemas live in the API Reference tab.
Buy
paymentMethod is wire_transfer or a Stripe pm_ / ba_ id — not the stripe / stripe_ach labels from the payment-methods list. Omit shipping when vault shipping is selected. Side-specific details: Buy.
Sell
productId + variantId + quantity. Listing conflicts, instant payout, and optional-fee reconciliation: Sell.
After execute — where the order lives
Order list endpoints are named from Pure’s warehouse, not from your quote side. Execute succeeding is not the same as a shipping label existing.
A sell showing up under purchase orders is expected. Poll
GET /orders/get-purchase-order/v1?id={orderId} for shippingLabelUrl — labels are generated after confirm, not in the execute response. That can take well more than 10–15 minutes.