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

# Checkout handoff

> Map reviewed UQP quotes into UCP wire artifacts without executing payments.

## Scope and draft status

UCP **2026-08-25 is the primary wire handoff**; ACP is secondary. The UQP plug-in artifacts have entity version `2026-11-05`. Everything here is **reference, not production**, and no live merchant checkout is provided. This is **mapping to draft proposals; subject to change**: UCP issue #929 / draft PR #930 and ACP's unreleased quote fields and attribution RFC are not stable contracts. No UCP or ACP conformance is claimed.

The UCP schema fixtures are credited to the UCP authors, © UCP authors, Apache-2.0. The original authoritative schema identifiers are `https://ucp.dev/2026-08-25/schemas/...`; UQP artifacts refer to those identifiers rather than republishing UCP schemas as UQP definitions. Offline test fixtures preserve the supplied schema text and accompanying NOTICE. The explanations on this page are original UQP documentation.

## Optional deposit policy

The existing `deposit` amount, currency and policy strings remain valid. Additive fields are `capture_on` (`accept`, `booking` or `immediate`), nullable RFC 3339 `refundable_until`, and `policy_url`. These express the provider's policy, not an instruction to a processor. A null deadline does not by itself explain refund eligibility; retain the policy text and URL. UQP never holds funds or performs PSP authorization/capture.

Client approval must still explicitly cover the exact deposit and policy before external handoff. Silence is never acceptance. Only trusted processor confirmation establishes payment. UCP #929 explicitly leaves deposits, holds and payment execution outside its scope; this policy bridges metadata, not execution.

## UCP composition

| Capability / checkout field | UQP use |
| - | - |
| `dev.ucp.common.payment.terms` | Describe deposit installments and balance due at the appointment. |
| `dev.ucp.shopping.buyer_consent` | Record consent by purpose; do not place policy-disclosure fields on consent. |
| Checkout warning message with `presentation: "disclosure"` | Present waiver and cancellation-policy text using the warning message shape. |
| `dev.ucp.common.payment.ap2_mandate` | Compose a signed mandate for a non-refundable deposit where appropriate; UQP does not sign or execute it. |
| `status: "requires_escalation"` plus `continue_url` | Send the client to a provider review continuation while the quote is pending. |

UCP checkout statuses are `incomplete`, `requires_escalation`, `ready_for_complete`, `complete_in_progress`, `completed` and `canceled`. They are checkout states, not the draft quotation statuses below. Pending provider review requires a continuation URL; it must not be treated as checkout completion.

## Draft quote mapping

| UQP lifecycle state | UCP #929 draft quote status |
| - | - |
| `VALIDATED_PENDING_REVIEW` | `pending` |
| `QUOTED` | `quoted` |
| `ACCEPTED` | `accepted` |
| `DECLINED` | `declined` |
| `EXPIRED` | `expired` |
| No UQP state | `withdrawn` — explicitly unmapped; no lifecycle transition is added. |

| UQP field | Handoff field |
| - | - |
| `Quote.id` | ACP `quote_id`; UCP draft `quote.accepted_id` |
| `Quote.expires_at` | ACP `quote_expires_at` |
| `checkout_handoff.protocol`, `.url` | Existing external checkout destination, unchanged |
| Optional `checkout_handoff.ucp_quote_status`, `.acp_quote_id`, `.quote_expires_at` | Additional draft mapping metadata |

The legacy `valid_until` remains supported; do not remove it when adding `expires_at`. ACP's `quote_id`, `quote_expires_at` and shared payment token (SPT) are secondary mapping points, not a PSP integration. Neutral `attribution` resembles ACP affiliate-attribution metadata without importing a vendor identity or promising token redemption.

## Quote lock and precise wire data

[quote\_lock](https://uqp.dev/docs/ucp/quote_lock.md) uses the UCP extension `allOf` pattern for both checkout and order. Its optional `quote_lock` carries `quote_id`, lowercase SHA-256 `quote_hash`, `intake_summary`, `scope_exclusions` and RFC 3339 `quote_expires_at`. The hash is SHA-256 over RFC 8785 JCS-canonicalized Quote JSON. It binds the exact quote data; it is not a signature or proof of payment. The typed mappings and conversion helpers live in `spec/handoff.ts`.

UCP wire money is an integer in currency minor units, between zero and `9007199254740991`. For example, `15000` denotes USD 150.00. **Example data, not real prices.** Native UQP retains its existing numeric `min`/`max`/`amount`; optional `min_minor`, `max_minor` and `amount_minor` add precise representations without breaking old quotes. `toMinorUnits` uses ISO 4217 currency exponents, including zero-, three- and four-decimal exceptions (for example JPY, KWD and CLF respectively), and rejects non-representable amounts rather than silently rounding. See the helper’s checked-in exponent table for the supported exceptions; do not assume every currency uses two decimal places.

`quantity` is an integer from 1 through `9007199254740991`. `quantityUnit` supplies `unit`, optional `scale` and required `display_text`. The scale is a decimal exponent from 0 through 15, defaults to 0, and makes one quantity step equal to `10^-scale` of the unit; displayed quantity is `quantity × 10^-scale`. The discrete unit `C62` permits only scale 0. This matches UCP’s unit representation, not a divisor-valued scale. Units are UN/CEFACT Rec 20 `C62` (each), `INH` (inch), `CMT` (cm), `FTK` (square foot), `MTK` (square metre), `HUR` (hour) or `MIN` (minute). All handoff timestamps use RFC 3339 date-time strings. These transport helpers do not alter pack pricing or lifecycle transitions.


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