Skip to main content
Provider discovery is deliberately separate from a chargeable quote. Read the offers for one canonical product first:
An offer is provider-neutral. It includes the canonical product and option configuration, provider_id, availability, and portable fulfillment constraints. It never exposes a lab SKU, UID, recipe, account, or raw provider payload.

Availability and exact costs

An available WHCC offer carries a verified exact USD unit_cost_cents and a pricing_revision. That is discovery data, not a locked price or shipping quote. The response also includes fulfillment_constraints: a fulfillment group and, where applicable, eligible shipping services and requirements. unknown and unavailable are intentionally unpriced. Richmond Pro Lab (rpl) is currently an unknown canonical offer: it has no currency, unit_cost_cents, or pricing_revision. Do not manufacture a zero price or use an unknown offer as a fallback. An unavailable or unknown offer is not chargeable. Runtime readiness can omit a verified WHCC offer when that provider lane is not configured. Treat the returned list as current discovery state, not a guarantee that a later checkout will submit.

Create a quote

Use POST /v1/print-orders/quote with an order and routing object. Quotes are server-calculated, expire after 15 minutes, and freeze the selected provider’s public offer evidence.
The public quote response includes provider, provider_offer_lines, expires_at, and price. Every quoted offer line is available and has the selected provider, configuration, exact unit cost, quantity, line subtotal, and pricing revision. Those subtotals reconcile to price.merchandise_cents. price contains server-calculated merchandise, shipping, tax, and Batch Relay API access-fee fields. No provider-offer warning or multi-provider fulfillment-group field is exposed by this HTTP quote contract. Do not depend on domain-model-only warnings in an API client.

Routing remains one provider

studio_default and single_provider require one provider to fulfill every line; neither silently substitutes another lab. If the selected provider cannot fulfill the order, the API returns 422 preferred_provider_incomplete with the unsupported lines and any whole-order alternatives. best_available is represented so clients can handle the intent, but it currently returns 422 split_fulfillment_unavailable. Split-provider HTTP submission is not enabled. It remains blocked until durable order storage can represent fulfillment groups, their independent shipping charges, submission states, and recovery safely.

Preserve offer identity and units

Match product.id, product.revision, configuration and provider_id exactly. Preserve pricing_revision as approved pricebook evidence. An approved zero is a valid amount; missing numeric data must stay unknown. unit_cost_cents applies to one ordered quantity. Use the product’s units_per_quantity for physical output. Quantity 2 of a 12-card pack produces 24 cards and consumes two pack costs. Do not apply the amount per individual card. Quote observations cannot approve a new rate. Public offers use the deployment’s environment and do not authorize a different credential lane or replace protected account-specific costs.