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

# Quotes and deposit holds

> Explicit authorization, idempotency and persisted state

`POST /v1/quotes` requires a bearer token and `Idempotency-Key`. Choose one or two provider IDs; more returns 422, never silent truncation.

```json theme={null}
{"provider_ids":["fixture_provider"],"pack_id":"tattoo/custom","locked_total_minor":20000,"deposit_minor":2000,"currency":"USD"}
```

Reuse the key only for the identical request: replay is safe, but a changed payload returns 409. Get real IDs from [provider discovery](https://docs.quote.dev/providers-and-tiers.md). Read persisted state with `GET /v1/quotes/:id`. States include `VALIDATED_PENDING_REVIEW`, `APPROVED`, `COUNTERED`, `DECLINED`, `EXPIRED`; default validity is seven days.

`POST /v1/quotes/:id/authorize` authorizes a hold. `POST /v1/quotes/:id/accept-counter` accepts revised terms; `/cancel` cancels. Present revised amounts for consent before accepting a counter. A live request without a payment method can return `requires_escalation: true` with a hosted `continue_url`; return it to the user rather than claiming payment succeeded.

Test keys produce deterministic simulated holds with no Stripe HTTP and zero charges. Live processing fails closed without configured Stripe and provider connected account. Holds use manual capture; approval and capture are distinct from estimation. Declined, expired and uncaptured holds incur zero platform fee. Only a captured live hold can accrue an isolated partner bounty. The payout ledger never processes deposits.

See [signed quote locks](https://docs.quote.dev/quote-lock.md) and the [API reference](https://api.quote.dev/reference).


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