---
title: "Get a deposit quote"
method: POST
path: "/quotes/preview"
tags: ["Processing"]
---

# Get a deposit quote

`POST /quotes/preview`

## Request

- Base URL: `https://v1.orchestrator.rhinestone.dev/deposit-processor`
- URL: `https://v1.orchestrator.rhinestone.dev/deposit-processor/quotes/preview`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer
- TypeScript: <https://skmtc.dev/rhinestonewtf/apis/deposit-service-api/docs/quotes/preview/post.ts> (a function with typed inputs; its response is checked against the schema)

Estimates fees, output, and completion time for a deposit.

## Headers

- `x-api-key` string: API key for authentication

## Request body

- QuotePreviewRequest
  - `account` string, required: Ethereum address (0x followed by 40 hex characters)
  - `sourceChainId` string, required: CAIP-2 chain identifier (e.g. "eip155:8453")
  - `sourceToken` string, required: Source token: a 0x address on an EVM source chain, or a base58 SPL mint on Solana.
  - `direction` 'exactIn' | 'exactOut': `exactIn` fixes the deposited `amount` and quotes what is delivered; `exactOut` fixes the delivered `amountOut` and quotes the deposit that produces it. Defaults to `exactIn`.
  - `amount` string: Deposited amount in the source token's smallest unit. Required for (and only valid with) `direction: exactIn`.
  - `amountOut` string: Delivered amount in the destination token's smallest unit. Required for (and only valid with) `direction: exactOut`; the quote's `input.amount` is then the deposit that produces it.

## Response `200`

Indicative quote for the requested route

- QuotePreviewResponse
  - `settlementLayer` string, required
  - `expiresAt` integer, required
  - `estimatedFillTimeSeconds` integer, required: The orchestrator's estimate for the fill leg, in seconds. Covers bridging only; see `timing.expectedSeconds` for the end-to-end expectation.
  - `timing` DepositTimingEstimate: Indicative, non-contractual duration estimate derived from qualifying recent completed deposits on the corridor or chain pair, falling back to the selected route’s indicative estimate when aggregate data is unavailable. Always `expectedSeconds` <= `softDelaySeconds` <= `escalatedDelaySeconds`. On a deposit the seconds are measured from its `createdAt` and are served only while it is still in flight (`pending`, `processing`, `delayed`); on a quote preview they describe the quoted route. Resolved per request, so it may change between calls, and absent whenever no estimate is available. Never a deadline, an expiry or a guarantee.
    - `expectedSeconds` integer, required: How long the deposit is expected to take end to end, in seconds. Derived from qualifying recent completed deposits or the selected route’s indicative estimate; never a deadline or guarantee.
    - `softDelaySeconds` integer, required: Seconds after which the deposit is running slower than usual and a client may reassure the user. Indicative only.
    - `escalatedDelaySeconds` integer, required: Seconds after which the deposit is unusually slow and a client may offer support. Indicative only, not an SLA.
  - `fees` object, required
    - `total` object, required
      - `usd` number, required
    - `totalUsd` number
    - `breakdown` object, required
      - `gas` PreviewFeeLine, required
        - `usd` number, required
        - `sponsored` boolean, required
        - `label` string
        - `internal` boolean
      - `bridge` PreviewFeeLine, required
        - `usd` number, required
        - `sponsored` boolean, required
        - `label` string
        - `internal` boolean
      - `swap` PreviewFeeLine, required
        - `usd` number, required
        - `sponsored` boolean, required
        - `label` string
        - `internal` boolean
      - `app` PreviewFeeLine, required
        - `usd` number, required
        - `sponsored` boolean, required
        - `label` string
        - `internal` boolean
      - `protocol` PreviewFeeLine, required
        - `usd` number, required
        - `sponsored` boolean, required
        - `label` string
        - `internal` boolean
      - `sponsorSurcharge` PreviewFeeLine, required
        - `usd` number, required
        - `sponsored` boolean, required
        - `label` string
        - `internal` boolean
  - `input` object, required
    - `token` string, required
    - `amount` string, required
    - `symbol` string, nullable, required
    - `decimals` integer, nullable, required
  - `output` object, required
    - `token` string, required
    - `amount` string, required
    - `symbol` string, nullable, required
    - `decimals` integer, nullable, required

## Other responses

- `400`: Malformed request body or unsupported source chain
- `401`: Missing or invalid API key
- `403`: API key lacks required deposits scope
- `404`: Account not found or not owned by the caller
- `422`: Route cannot be priced (the account's output-token rules map the source token to nothing, no available routes, no session to build a binding quote with on a route only the binding quote can price, or exact-out asked of such a route). A quote does not mean a deposit would be accepted: the client whitelist, session coverage and token policy are applied when the deposit arrives. Only ever a refusal, never an outage: a dependency failure answers 503.
- `500`: Internal server error
- `503`: `QUOTE_UNAVAILABLE`: a dependency needed to price the route is unavailable; retry after the Retry-After delay. Never a route refusal.

## Changes

- **2026-11-06** `aa1767d704fa`: 5 info
  - the endpoint scheme security `internalProjectBearer` was added to the API
  - the endpoint scheme security `tenantApiKey` was added to the API
  - the `header` request parameter `x-api-key` became optional
  - added the non-success response with the status `500`
  - …1 more
- **2026-10-07** `8b74181ef9e2`: 1 breaking, 4 info
  - the response's body type changed from no type to `object` for status `422`
  - removed `#/components/schemas/ErrorResponse, subschema #2` from the response body `allOf` list for the response status `422`
  - added the optional property `code` to the response with the `422` status
  - added the optional property `details` to the response with the `422` status
  - …1 more
- **2026-09-22** `5bfd3ae2eab9`: 1 info
  - removed the pattern `^0x[a-fA-F0-9]{40}$` from the request property `sourceToken`
- **2026-09-21** `f658a6e2cafc`: 2 breaking, 2 warning, 5 info
  - the response's body type changed from `object` to no type for status `422`
  - removed the required property `error` from the response with the `422` status
  - removed the optional property `code` from the response with the `422` status
  - removed the optional property `details` from the response with the `422` status
  - …5 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/rhinestonewtf/apis/deposit-service-api/changes/quotes/preview/post.md)

---

[API](https://skmtc.dev/rhinestonewtf/apis/deposit-service-api.md) - [All operations](https://skmtc.dev/rhinestonewtf/apis/deposit-service-api/llms.txt) - [OpenAPI document](https://skmtc.dev/rhinestonewtf/apis/deposit-service-api/revisions/aa1767d704fa?raw)
