Skip to main content
Create a quote, optionally pick add-ons, then execute with 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)
A cheaper buy or a richer sell still goes through. 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

Sell items can also be 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.

Shared rules

Roles