webaz_quote_order
Server-authoritative buyer QUOTE (safe scope price_quote; OAuth grant). Integer line items + a single-use time-limited quote_token bound to your account. QUOTE ONLY: no order, no payment, no funds locked, no stock reserved (availability re-checked at real order creation). Uses your SAVED default address server-side (never returned); no default → DEFAULT_ADDRESS_REQUIRED (never paste an address into chat). Amounts are INTEGER base-units (exp 6) — never sum lines yourself. payment_rail: direct_p2p (live; you pay the seller directly, WebAZ holds no funds) | usdc_escrow (on-chain escrow, channel-gated). The compatibility-only escrow input is rejected. Ineligible rails FAIL — never auto-switched. payment_options = price per method; pick lowest payable_units: direct_p2p → account_id as direct_receive_account_id; usdc_escrow → payment_rail. Variants: if the product has variants and the user has not chosen one, show the options with prices and ask first; never pick one yourself. quote_token: 10-min single-use, bound to you+product+quantity+address+rail+amounts. Next: webaz_order_draft → webaz_submit_order_request → the human approves on webaz.xyz.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | Instead of variant_id: {dimension: value} per variant_dimensions | |
| offer_id | No | RFC-032 negotiated offer (off_…) for your human: prices the quote at min(offer, listing), answers price_basis:"offer" + list_price_units_at_offer + offer_expires_at, expires no later than the offer, and carries it through draft → approval → order. Consumes nothing. See place_order's offer_id for the full rule. | |
| quantity | No | Positive safe integer (default 1). Strings/decimals rejected — no implicit conversion. | |
| product_id | Yes | Active listing id (server re-reads product + seller state) | |
| variant_id | No | Required when the product has variants | |
| donation_bps | No | Integer basis points (0/0.5%/1%/2%/5%), charged IN ADDITION to total. Never auto-set. | |
| payment_rail | No | direct_p2p (live) | usdc_escrow (on-chain, channel-gated). The compatibility-only escrow input is rejected. Ineligible rails fail — never auto-switched. | |
| address_source | No | Only 'default' in v1 — your saved default address, resolved server-side, never shown. | |
| idempotency_key | No | Optional client key: same subject+key+payload within TTL returns the SAME quote; same key with a different payload → IDEMPOTENCY_CONFLICT. | |
| anonymous_recipient | No | Escrow only (direct_p2p v1 rejects it). | |
| direct_receive_account_id | No | direct_p2p only: a known ACTIVE receiving account of this seller (no free-text payment instructions). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| error | No | present ONLY on failure (with error_code + structured recovery fields) | |
| price | No | product price: amount_minor / currency USDC / display (display line only; fx table gives display-only local conversions) | |
| status | No | v2 status {code,label,label_en}; code canonical (never from label) | |
| amounts | No | minor breakdown {item,shipping,other,payment_discount?} | |
| options | No | VARIANT_REQUIRED only: bounded active in-stock SKU choices {variant_id,sku?,options,price,stock_status}; choose explicitly, never guess | |
| product | No | {id, title} | |
| quantity | No | positive integer, or null when invalid (see quantity_valid); display-only (amount=price.amount_minor) | |
| quote_id | No | ||
| shipping | No | ||
| rail_note | No | per-rail honesty note: escrow(WAZ)=simulated; usdc_escrow=real USDC in the Base contract; direct_p2p=no principal held | |
| error_code | No | ||
| expires_at | No | ||
| destination | No | region tag + masked summary only | |
| disclosures | No | ||
| quote_token | No | single-use, 10-min TTL — pass to webaz_order_draft | |
| return_days | No | ||
| payment_rail | No | ||
| fiat_estimate | No | display-only ≈local-fiat {currency,display,rate,as_of,stale}; never a settlement amount; omitted when unavailable | |
| warranty_days | No | ||
| quantity_error | No | invalid-quantity code: missing|empty|zero|negative|not_integer|overflow|non_numeric | |
| quantity_valid | No | false only when quantity is invalid data (card shows 数量数据异常, buttons disabled) | |
| schema_version | No | ||
| stock_reserved | No | ||
| payment_options | No | [{rail,account_id?,method_label,payable_units,discount_units,protection}]; usdc_escrow last | |
| available_actions | No | ||
| selection_required | No | VARIANT_REQUIRED only: the buyer must choose a variant before retrying | |
| variant_options_total | No | VARIANT_REQUIRED only: total active in-stock SKU choices | |
| economic_action_executed | No | ||
| variant_options_truncated | No | VARIANT_REQUIRED only: true when the bounded options array omits additional choices |