---
description: "This endpoint calculates and validates the required inputs for a sell transaction, including accurate pricing estimates, fees, and limits."
title: "Prepare Sell Transaction"
---

# Prepare Sell Transaction

> This endpoint calculates and validates the required inputs for a sell transaction, including accurate pricing estimates, fees, and limits.

```http
POST /transactions/sell/prepare
```

- `https://api.sandbox.noah.com/v1/transactions/sell/prepare` — V1 Sandbox Server
- `https://api.noah.com/v1/transactions/sell/prepare` — V1 Production Server

## Authentication

- `X-Api-Key`: Your Noah API key. Required on all requests. See [API Keys](/api-concepts/authentication/api).
- `Api-Signature`: Digitally signed JWT used to verify request authenticity. Optional in sandbox when your API key has no associated signing public key; required in production for all requests. If sent, the signature is always validated. See [Request Signing](/api-concepts/authentication/signing).

## Request body

### `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `(body)` | object | Yes | Request to prepare a sell transaction. Exactly one of `FiatAmount` or `CryptoAmount` must be supplied (XOR); the other is derived from the channel's rate. When `Quoted` is true the response includes a `SellQuote` that locks the conversion rate and recipient payout. |
| `ChannelID` | string (uuid) | Yes | Unique identifier for the channel. (length 36-36) |
| `FormSessionID` | string (uuid) | No | Unique identifier for the Form Session. Form Session allows ramping using provided form data. |
| `PaymentMethodID` | string | No | Existing payment method id to be used. (length 1-150) |
| `CryptoCurrency` | string | Yes | Cryptocurrency: \| Environment \| BTC \| ETH \| USDC \| \|------------\|-----\|-------\|------\| \| Sandbox \| BTC_TEST \| ETH_TEST_SEPOLIA \| USDC_TEST \| \| Production \| BTC \| ETH \| USDC \| |
| `CustomerID` | string | No | A unique ID which identifies the customer in the Business' internal system and in NOAH. (length 1-42) |
| `FiatAmount` | string | No | Amount sent to customer's payment method. When omitted, the full `CryptoAuthorizedAmount` is sold at the execution-time market rate (full liquidation mode). Mutually exclusive with `CryptoAmount`; exactly one must be provided. (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `CryptoAmount` | string | No | Exact amount of cryptocurrency the depositor will send. Mutually exclusive with `FiatAmount`; exactly one must be provided. (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `Quoted` | boolean | No | Opt in to fixed-quote behaviour. When true and all form steps are complete, the response includes a `SellQuote` whose `SignedQuote` can be used to lock the conversion rate and recipient payout. (default `false`) |
| `Form` | object | No | Form input to be submitted based on returned FormSchema (additional properties allowed) |
| `DelayedSell` | boolean | No | When enabled, balance checks are deferred until the final sell request, allowing the order to be prepared now and executed later. |
| `Version` | string | No | Optional API version. |
| `BusinessFee` | object | No | Per-transaction business fee applied to the customer for this sell. |
| `BusinessFee.FeeBase` | string | No | Fixed base fee amount. When set, FiatCurrency is required. (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `BusinessFee.FeePct` | string | No | Variable percentage fee from 0 to 100 (e.g. 0.5 means 0.5%, 50 means 50%). (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `BusinessFee.FiatCurrency` | string | No | Supported fiat ISO_4217 3 letter currency codes. |

## Responses

### 200 — Sell request data

#### `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `TotalFee` | string | Yes | The total fee that will be charged for using the specific channel, always specified in the same currency as the requested fiat segment of the transaction. (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `CryptoAmountEstimate` | string | Yes | The estimated amount of cryptocurrency that will be used in this transaction. Locked if quoted is true. (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `CryptoAuthorizedAmount` | string | Yes | Maximum amount that can be charged for this transaction. This will be used in your subsequent `/transactions/sell` request. Same as `CryptoAmount` if provided in the request. (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `FormSessionID` | string (uuid) | Yes | Unique identifier for the Form Session. Form Session allows ramping using provided form data. |
| `NextStep` | object | No |  |
| `NextStep.StepID` | `Vop` \| `Cob` \| `PaymentDetails` | Yes | Identifier for a form step. |
| `NextStep.StepType` | `Ack` \| `DataEntry` | Yes | UX intent for the next step. Ack: acknowledgement-only step. DataEntry: collect new information. |
| `NextStep.Schema` | object | Yes | JSON schema for the form |
| `NextStep.Schema.$schema` | string | Yes |  |
| `NextStep.Schema.type` | string | Yes |  |
| `NextStep.Schema.title` | string | No |  |
| `NextStep.Schema.description` | string | No |  |
| `NextStep.Schema.properties` | object | Yes | (additional properties allowed) |
| `NextStep.Schema.required` | string[] | No |  |
| `NextStep.Schema.allOf` | object[] | No |  |
| `Quote` | object | No | Fixed-rate quote. Present only when the request set `Quoted: true` and all form steps are complete (`NextStep` is absent). Clients bind this quote to payout transaction by passing its `SignedQuote` unchanged when creating the payout rule or transaction. |
| `Quote.SignedQuote` | string | Yes | Signed string that encodes all binding claims for this quote (`crypto_currency`, `fiat_currency`, `crypto_amount`, `fiat_amount`, `rate`, `total_fee`, `breakdown`, `expiry`). Treat as an opaque bearer: pass back unchanged. The remaining fields are provided as human-readable disclosures so the depositor UI can render the quote without decoding the string. |
| `Quote.Expiry` | string (date-time) | Yes | Deadline by which the deposit must be observed AND fully cleared for this quote to apply. 'Cleared' means: (a) the on-chain transfer has reached the finality threshold Noah requires for the arrival network (which varies per chain — e.g. more confirmations are required on Ethereum than on Solana), and (b) downstream compliance and screening checks against the source address have completed successfully. Deposits whose finality and compliance clear after `Expiry` no longer match the locked quoted and will proceed with current market rate. Clients should choose `Networks` on the trigger with this finality variance in mind; the prepare response uses a server-side minimum `Expiry` floor per network. |
| `CryptoCurrency` | string | No | Cryptocurrency: \| Environment \| BTC \| ETH \| USDC \| \|------------\|-----\|-------\|------\| \| Sandbox \| BTC_TEST \| ETH_TEST_SEPOLIA \| USDC_TEST \| \| Production \| BTC \| ETH \| USDC \| |
| `FiatCurrency` | string | No | Supported fiat ISO_4217 3 letter currency codes. |
| `FiatAmount` | string | No | Net amount of `FiatCurrency` the recipient's payment method will receive after every fee in `Breakdown` has been applied. Locked if quoted is true. (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `Rate` | string | No | Composite `CryptoCurrency -> FiatCurrency` rate (1 `CryptoCurrency` buys X `FiatCurrency`). Already includes any FX leg; clients do not need to reason about intermediate fiats. Locked if quoted is true. (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `Breakdown` | object[] | No | Per-type payment breakdown in `CryptoCurrency`. Items are additive: `ChannelFee` + `BusinessFee` + `Remaining` = `CryptoAmountEstimate`. The `Remaining` line equals `FiatAmount / Rate` (the net crypto equivalent of the fiat payout); `ChannelFee` and `BusinessFee`, when each converted at `Rate`, sum to `TotalFee`. |
| `Breakdown[].Type` | string | Yes | What does the breakdown item amount refer to: * ChannelFee: amount withheld by the system from the fiat payment * BusinessFee: amount withheld on behalf of the business from its customers transactions * Remaining: net amount after all fees have been deducted |
| `Breakdown[].Amount` | string | Yes | (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `Breakdown[].FixedAmount` | string | No | Fixed base portion of this fee line (same unit as Amount). (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |
| `Breakdown[].VariableAmount` | string | No | Variable percentage portion of this fee line (same unit as Amount). (length 1-38; pattern `^[+]?([.]\d+\|\d+[.]?\d*)$`) |

### 400 — Bad request

### 401 — Client is not authorized to perform this action

### 500 — Internal server error

Error responses share one `Error` envelope across the whole API. See https://docs.noah.com/api-concepts/errors.md for its fields, the `Type` values, and the field-level validation details in `RequestExtension` and `DenyExtension`.

## See also

- Rendered reference: https://docs.noah.com/api-reference/prepare-sell-transaction
- OpenAPI document: https://docs.noah.com/files/oas-schema.generated.json
