> ## Documentation Index
> Fetch the complete documentation index at: https://docs.batchrelay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Provider Offers and Quotes

> Discover canonical provider offers and create one-provider quotes.

Provider discovery is deliberately separate from a chargeable quote. Read the
offers for one canonical product first:

```http theme={null}
GET /v1/catalog/products/{product_id}/offers
```

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.

```json theme={null}
{
  "routing": { "mode": "single_provider", "provider_id": "whcc" },
  "order": { "...": "see the API reference" }
}
```

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.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.