> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.getsinbad.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.getsinbad.com/_mcp/server.

# Find the best offer

POST https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best
Content-Type: application/json

Find the best offer.

**Credential:** Customer session

**Before you call**

- A customer session for the same partner, integration, customer, wallet and chain.
- An active saved account matching the catalog payment method.
- A registered customer wallet and supported chain.

Finds merchant offers that match a customer's BUY or SELL request.

`amount.mode` sets what `amount.value` means. With `USDT`, it is an exact token quantity. With `FIAT`, it is the market value of the tokens in `fiatCurrencyId`, before merchant margin and fees, for both BUY and SELL. Sinbad converts it to USDT using the current fiat/USD and USDT/USD rates, rounded down to six decimals. The final fiat payment includes merchant pricing and fees, so it can differ from the amount you entered.

`paymentMethodId` is required. On a SELL, set `savedPaymentMethodId` to choose the receiving account. If you omit it, Sinbad selects the customer's first active matching account.

The response contains one `instant` offer or up to three `alternatives`. If the amount is outside every listing's limits, or no inventory is eligible, the response is `200` with empty results. Sinbad excludes the customer's own merchant wallet, ignoring case. If that is the only otherwise eligible match, the call returns `400 VALIDATION_ERROR` with `details.reason: SELF_TRADE_NOT_ALLOWED`.

To create a breakdown, send the chosen offer's `breakdownInput` unchanged. A new FIAT search returns a fixed USDT amount in `breakdownInput`, so the token quantity stays the same through checkout and across alternative currencies. A closest-amount suggestion can change that quantity.

Offer searches and breakdown creation share a limit of 60 requests per minute for each customer and integration. A `429` response includes `Retry-After`. Sinbad rechecks the price, listing availability and fees when you create the breakdown. You are responsible for verifying your customers' identity. Location enforcement depends on the environment, so confirm the enabled policy with Sinbad.



> Confirm with Sinbad that this endpoint is enabled in your environment.

**Errors**

| Status | Code | What to do |
| --- | --- | --- |
| 400 | `VALIDATION_ERROR` | Correct the fields reported in details before retrying. |
| 401 | `UNAUTHENTICATED` | Create a new customer session or use a valid server credential. |
| 403 | `FORBIDDEN` | Check credential ownership, integration and the supplied Origin. |
| 409 | `CONFLICT` | Read the current state again before you prepare or retry. |
| 429 | `RATE_LIMITED` | Wait for Retry-After before retrying. |
| 503 | `UPSTREAM_ERROR` | Retry with backoff; preserve the same idempotency key for a repeated mutation. |

Reference: https://docs.getsinbad.com/api-reference/offers-and-breakdowns/find-best-offer

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Body (application/json)

This endpoint expects an offers_quotes__OfferFilters.

- `tokenSymbol` (enum, required)
  - Allowed values: `USDT`
- `fiatCurrencyId` (string, required)
- `paymentMethodId` (string, required) — Required catalog method owned by the customer through an active saved account.
- `amount` (OffersQuotesOfferFiltersAmount, required) — FIAT is the principal's market value in fiatCurrencyId before merchant margin and fees; USDT is an exact token quantity. FIAT conversion rounds down to six USDT decimals.
- `side` (enum, optional) — Customer action.
  - Allowed values: `BUY`, `SELL`
- `type` (enum, optional) — Alias for customer side; conflicting aliases are rejected.
  - Allowed values: `BUY`, `SELL`
- `displayCalculationMode` (enum, optional, default: DUMMY) — Card/Sheet display only. DUMMY uses a $10 USD example; REAL uses the actual requested or suggested amount. Execution always uses actual pricing. Preserve in issued breakdownInput.
  - Allowed values: `DUMMY`, `REAL`
- `scheduled_at` (string, optional) — Optional ISO 8601 date-time, formatted YYYY-MM-DDTHH:mm[:ss[.SSS]][Z|±HH:MM]. Fractional seconds accept at most 3 digits, so truncate 6-digit values such as .190505 to milliseconds. An offset-free value uses timezone, or UTC if timezone is omitted. A value with Z or an explicit offset keeps that offset and ignores timezone. Normalized to UTC in breakdownInput. Filters merchant hours only; does not delay execution. Malformed, invalid or ambiguous local times (such as during a daylight saving change) are rejected with VALIDATION_ERROR.
- `timezone` (string, optional) — Optional IANA timezone name such as Asia/Karachi. Used only for an offset-free scheduled_at and ignored when scheduled_at has Z or an offset. Merchant hours use the merchant timezone at the scheduled instant.
- `savedPaymentMethodId` (string, optional)
- `minRatingPercent` (double, optional) — Optional minimum merchant rating; unrated merchants do not match.
- `minTradeCount` (integer, optional) — Optional minimum recorded merchant trade count.
- `ignoreMerchantOnline` (boolean, optional, default: false) — Include offline merchants. Preserve this value when creating a breakdown.
- `ignoreTradingHours` (boolean, optional, default: false) — Skip only supplied scheduled-hours filtering, including for alternatives. Preserve this value when creating a breakdown.

## Response

### 200

One customer-scoped round-robin match or up to three alternatives; empty arrays mean no inventory.

- `instant` (list of offers_quotes__Offer, required)
- `alternatives` (list of offers_quotes__Alternative, required)
- `paymentMethod` (OffersQuotesInstantOfferResponsePaymentMethod, required)

## Errors

### 400 Bad Request Error

The request is invalid.

- `error` (V1OffersBestPostResponsesContentApplicationJsonSchemaError, required)

### 401 Unauthorized Error

Authentication is required.

- `error` (V1OffersBestPostResponsesContentApplicationJsonSchemaError, required)

### 403 Forbidden Error

You do not have permission to perform this action.

- `error` (V1OffersBestPostResponsesContentApplicationJsonSchemaError, required)

### 409 Conflict Error

The request conflicts with the current state of the resource.

- `error` (V1OffersBestPostResponsesContentApplicationJsonSchemaError, required)

### 429 Too Many Requests Error

Too many requests. Please try again later.

- `error` (V1OffersBestPostResponsesContentApplicationJsonSchemaError, required)

### 503 Service Unavailable Error

Service temporarily unavailable.

- `error` (V1OffersBestPostResponsesContentApplicationJsonSchemaError, required)

## Types

### OffersQuotesOfferFiltersAmount

FIAT is the principal's market value in fiatCurrencyId before merchant margin and fees; USDT is an exact token quantity. FIAT conversion rounds down to six USDT decimals.

- `mode` (enum, required)
  - Allowed values: `FIAT`, `USDT`
- `value` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.

### offers_quotes__Offer

- `merchant` (offers_quotes__MerchantDisplay, required) — Offer values are current observations; breakdown POST, GET and retries return the same creation snapshot.
- `displayCalculationMode` (enum, required)
  - Allowed values: `DUMMY`, `REAL`
- `displayCalculationBasis` (enum, required)
  - Allowed values: `FIXED_USD_10`, `ACTUAL_AMOUNT`
- `displayAvailable` (boolean, required) — Whether Card/Sheet are available. REAL uses actual pricing; a DUMMY example may be unavailable when small amounts cannot cover fees.
- `id` (string, required) — Canonical listing ID.
- `offerId` (string, required)
- `fingerprint` (string, required)
- `type` (enum, required) — Merchant action, opposite the customer side.
  - Allowed values: `BUY`, `SELL`
- `side` (enum, required) — Customer action.
  - Allowed values: `BUY`, `SELL`
- `tokenSymbol` (enum, required)
  - Allowed values: `USDT`
- `fiatCurrencyId` (string, required)
- `fiatCurrency` (OffersQuotesOfferFiatCurrency, required)
- `catalogPaymentMethodIds` (list of string, required)
- `paymentMethods` (list of offers_quotes__SafePaymentMethod, required)
- `paymentMethod` (offers_quotes__SafePaymentMethod, required)
- `pricing` (offers_quotes__Pricing, required)
- `breakdownInput` (offers_quotes__CreateBreakdown, required) — Send unchanged to create a trade breakdown.
- `calculationBasis` (enum, required)
  - Allowed values: `REQUESTED_AMOUNT`, `SUGGESTED_AMOUNT`
- `pricingSource` (enum, required)
  - Allowed values: `partner-escrow-fee-policy`
- `pricedAt` (datetime, required)
- `executable` (boolean, required)
- `alternativeType` (enum, optional)
  - Allowed values: `closest_amount`, `best_for_payment_method`, `best_for_currency`
- `suggestedAmount` (double, optional)
- `minAmount` (double, optional)
- `maxAmount` (double, optional)
- `minAmountFiat` (double, optional)
- `maxAmountFiat` (double, optional)
- `effectiveMargin` (double, optional)
- `cryptoPrice` (double, optional) — USD per USDT from the pricing oracle.
- `currencyRate` (double, optional) — USD per fiat unit; the reciprocal of the currencies endpoint effectiveRate.
- `localCryptoPrice` (double, optional) — Fiat per USDT at the market rate before merchant margin and customer fees.
- `margin` (double, optional, nullable) — Basis points.
- `flatCharges` (double, optional, nullable) — USD.
- `Card` (OffersQuotesOfferCard, optional)
- `Sheet` (OffersQuotesOfferSheet, optional)

### offers_quotes__Alternative

An offer plus its alternative category and optional suggested token quantity.

- `merchant` (offers_quotes__MerchantDisplay, required) — Offer values are current observations; breakdown POST, GET and retries return the same creation snapshot.
- `displayCalculationMode` (enum, required)
  - Allowed values: `DUMMY`, `REAL`
- `displayCalculationBasis` (enum, required)
  - Allowed values: `FIXED_USD_10`, `ACTUAL_AMOUNT`
- `displayAvailable` (boolean, required) — Whether Card/Sheet are available. REAL uses actual pricing; a DUMMY example may be unavailable when small amounts cannot cover fees.
- `alternativeType` (enum, required)
  - Allowed values: `closest_amount`, `best_for_payment_method`, `best_for_currency`
- `id` (string, required) — Canonical listing ID.
- `offerId` (string, required)
- `fingerprint` (string, required)
- `type` (enum, required) — Merchant action, opposite the customer side.
  - Allowed values: `BUY`, `SELL`
- `side` (enum, required) — Customer action.
  - Allowed values: `BUY`, `SELL`
- `tokenSymbol` (enum, required)
  - Allowed values: `USDT`
- `fiatCurrencyId` (string, required)
- `fiatCurrency` (OffersQuotesAlternativeFiatCurrency, required)
- `catalogPaymentMethodIds` (list of string, required)
- `paymentMethods` (list of offers_quotes__SafePaymentMethod, required)
- `paymentMethod` (offers_quotes__SafePaymentMethod, required)
- `pricing` (offers_quotes__Pricing, required)
- `breakdownInput` (offers_quotes__CreateBreakdown, required) — Send unchanged to create a trade breakdown.
- `calculationBasis` (enum, required)
  - Allowed values: `REQUESTED_AMOUNT`, `SUGGESTED_AMOUNT`
- `pricingSource` (enum, required)
  - Allowed values: `partner-escrow-fee-policy`
- `pricedAt` (datetime, required)
- `executable` (boolean, required)
- `suggestedAmount` (double, optional) — Token quantity; use breakdownInput for exact submission.
- `minAmount` (double, optional)
- `maxAmount` (double, optional)
- `minAmountFiat` (double, optional)
- `maxAmountFiat` (double, optional)
- `effectiveMargin` (double, optional)
- `cryptoPrice` (double, optional) — USD per USDT from the pricing oracle.
- `currencyRate` (double, optional) — USD per fiat unit; the reciprocal of the currencies endpoint effectiveRate.
- `localCryptoPrice` (double, optional) — Fiat per USDT at the market rate before merchant margin and customer fees.
- `margin` (double, optional, nullable) — Basis points.
- `flatCharges` (double, optional, nullable) — USD.
- `Card` (OffersQuotesAlternativeCard, optional)
- `Sheet` (OffersQuotesAlternativeSheet, optional)

### OffersQuotesInstantOfferResponsePaymentMethod

- OffersQuotesInstantOfferResponsePaymentMethod0
- map from string to any

### V1OffersBestPostResponsesContentApplicationJsonSchemaError

- `code` (string, required)
- `numericId` (integer, required)
- `message` (string, required)
- `requestId` (string, optional)
- `details` (map from string to any, optional)

### offers_quotes__MerchantDisplay

Offer values are current observations; breakdown POST, GET and retries return the same creation snapshot.

- `fullName` (string, required, nullable)
- `avatarUrl` (string, required, nullable)
- `username` (string, required, nullable)
- `ratingPercent` (double, required, nullable) — Null when no valid rating is available.
- `tradeCount` (integer, required)
- `isSuperMerchant` (boolean, required)
- `experienceYears` (integer, required) — Native display parity; floor of experienceDays divided by 365 with a minimum and fallback of one.

### OffersQuotesOfferFiatCurrency

- `id` (string, required)
- `code` (string, required)
- `name` (string, required)
- `symbol` (string, required)
- `decimals` (integer, required)

### offers_quotes__SafePaymentMethod

- `paymentMethodId` (string, required)
- `displayLabel` (string, required) — Catalog-provided name, never a private account label.
- `isActive` (boolean, required)
- `_logoURL` (string, required)
- `id` (string, optional) — Customer saved account ID; omitted for catalog summaries.

### offers_quotes__Pricing

- `merchantRateFiat` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `usdtAmount` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `customerFiatAmount` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `subtotalFiat` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `customerFeeFiat` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `platformFeeFiat` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `partnerFeeFiat` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `makerFeeUsdt` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `platformFeeUsdt` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `partnerFeeUsdt` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `lockAmountUsdt` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `recipientAmountUsdt` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.
- `refundAmountUsdt` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.

### offers_quotes__CreateBreakdown

- `side` (enum, required)
  - Allowed values: `BUY`, `SELL`
- `tokenSymbol` (enum, required)
  - Allowed values: `USDT`
- `fiatCurrencyId` (string, required)
- `paymentMethodId` (string, required) — Required catalog method owned by the customer through an active saved account.
- `savedPaymentMethodId` (string, required)
- `amount` (OffersQuotesCreateBreakdownAmount, required) — Copy the selected breakdownInput amount unchanged. New searches use USDT, including when discovery input was FIAT. Older issued FIAT selections retain their original final-fiat semantics.
- `offerId` (string, required)
- `fingerprint` (string, required) — Opaque signed preview fingerprint
- `displayCalculationMode` (enum, optional, default: DUMMY) — Card/Sheet display only. DUMMY uses a $10 USD example; REAL uses the actual requested or suggested amount. Execution always uses actual pricing. Preserve in issued breakdownInput.
  - Allowed values: `DUMMY`, `REAL`
- `scheduled_at` (string, optional) — Optional ISO 8601 date-time, formatted YYYY-MM-DDTHH:mm[:ss[.SSS]][Z|±HH:MM]. Fractional seconds accept at most 3 digits, so truncate 6-digit values such as .190505 to milliseconds. An offset-free value uses timezone, or UTC if timezone is omitted. A value with Z or an explicit offset keeps that offset and ignores timezone. Normalized to UTC in breakdownInput. Filters merchant hours only; does not delay execution. Malformed, invalid or ambiguous local times (such as during a daylight saving change) are rejected with VALIDATION_ERROR.
- `timezone` (string, optional) — Optional IANA timezone name such as Asia/Karachi. Used only for an offset-free scheduled_at and ignored when scheduled_at has Z or an offset. Merchant hours use the merchant timezone at the scheduled instant.
- `minRatingPercent` (double, optional) — Optional minimum merchant rating; unrated merchants do not match.
- `minTradeCount` (integer, optional) — Optional minimum recorded merchant trade count.
- `ignoreMerchantOnline` (boolean, optional, default: false) — Include offline merchants. Preserve this value when creating a breakdown.
- `ignoreTradingHours` (boolean, optional, default: false) — Skip only supplied scheduled-hours filtering, including for alternatives. Preserve this value when creating a breakdown.

### OffersQuotesOfferCard

- `Price` (offers_quotes__DisplayValue, required)
- `Margin` (offers_quotes__DisplayValue, required)
- `FiatPayment` (offers_quotes__DisplayValue, required)

### OffersQuotesOfferSheet

- `CryptoAmount` (offers_quotes__DisplayValue, optional)
- `MerchantRate` (offers_quotes__DisplayValue, optional)
- `BuyAmount` (offers_quotes__DisplayValue, optional)
- `SellAmount` (offers_quotes__DisplayValue, optional)
- `Subtotal` (offers_quotes__DisplayValue, optional)
- `ServiceFee` (offers_quotes__DisplayValue, optional)
- `PlatformFee` (offers_quotes__DisplayValue, optional)
- `PartnerFee` (offers_quotes__DisplayValue, optional)
- `MakerFee` (offers_quotes__DisplayValue, optional)
- `YouPay` (offers_quotes__DisplayValue, optional)
- `YouSell` (offers_quotes__DisplayValue, optional)

### OffersQuotesAlternativeFiatCurrency

- `id` (string, required)
- `code` (string, required)
- `name` (string, required)
- `symbol` (string, required)
- `decimals` (integer, required)

### OffersQuotesAlternativeCard

- `Price` (offers_quotes__DisplayValue, required)
- `Margin` (offers_quotes__DisplayValue, required)
- `FiatPayment` (offers_quotes__DisplayValue, required)

### OffersQuotesAlternativeSheet

- `CryptoAmount` (offers_quotes__DisplayValue, optional)
- `MerchantRate` (offers_quotes__DisplayValue, optional)
- `BuyAmount` (offers_quotes__DisplayValue, optional)
- `SellAmount` (offers_quotes__DisplayValue, optional)
- `Subtotal` (offers_quotes__DisplayValue, optional)
- `ServiceFee` (offers_quotes__DisplayValue, optional)
- `PlatformFee` (offers_quotes__DisplayValue, optional)
- `PartnerFee` (offers_quotes__DisplayValue, optional)
- `MakerFee` (offers_quotes__DisplayValue, optional)
- `YouPay` (offers_quotes__DisplayValue, optional)
- `YouSell` (offers_quotes__DisplayValue, optional)

### OffersQuotesInstantOfferResponsePaymentMethod0

- `paymentMethodId` (string, required)
- `displayLabel` (string, required) — Catalog-provided name, never a private account label.
- `isActive` (boolean, required)
- `_logoURL` (string, required)
- `id` (string, optional) — Customer saved account ID; omitted for catalog summaries.

### OffersQuotesCreateBreakdownAmount

Copy the selected breakdownInput amount unchanged. New searches use USDT, including when discovery input was FIAT. Older issued FIAT selections retain their original final-fiat semantics.

- `mode` (enum, required)
  - Allowed values: `FIAT`, `USDT`
- `value` (string, required) — Exact nonnegative decimal string. USDT has at most 6 places; fiat uses currency decimals.

### offers_quotes__DisplayValue

- `value` (double, required) — Display only; exact pricing strings govern execution.
- `type` (enum, required)
  - Allowed values: `fiat`, `crypto`, `percentage`

## Examples

### Default

**Request**

```json
{
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": {
    "mode": "USDT",
    "value": "100"
  },
  "side": "BUY"
}
```

**Response**

```json
{
  "instant": [
    {
      "merchant": {
        "fullName": "Demo merchant",
        "avatarUrl": "https://example.com/avatar.png",
        "username": "demo_merchant",
        "ratingPercent": 98,
        "tradeCount": 1240,
        "isSuperMerchant": true,
        "experienceYears": 3
      },
      "displayCalculationMode": "DUMMY",
      "displayCalculationBasis": "FIXED_USD_10",
      "displayAvailable": true,
      "id": "offer_demo",
      "offerId": "offer_demo",
      "fingerprint": "preview_fingerprint_from_offer_search",
      "type": "SELL",
      "side": "BUY",
      "tokenSymbol": "USDT",
      "fiatCurrencyId": "usd",
      "fiatCurrency": {
        "id": "usd",
        "code": "USD",
        "name": "US Dollar",
        "symbol": "$",
        "decimals": 2
      },
      "catalogPaymentMethodIds": [
        "bank_transfer"
      ],
      "paymentMethods": [
        {
          "paymentMethodId": "bank_transfer",
          "displayLabel": "Bank transfer",
          "isActive": true,
          "_logoURL": "",
          "id": "account_demo"
        }
      ],
      "paymentMethod": {
        "paymentMethodId": "bank_transfer",
        "displayLabel": "Bank transfer",
        "isActive": true,
        "_logoURL": "",
        "id": "account_demo"
      },
      "pricing": {
        "merchantRateFiat": "1",
        "usdtAmount": "100",
        "customerFiatAmount": "100",
        "subtotalFiat": "100",
        "customerFeeFiat": "0",
        "platformFeeFiat": "0",
        "partnerFeeFiat": "0",
        "makerFeeUsdt": "0",
        "platformFeeUsdt": "0",
        "partnerFeeUsdt": "0",
        "lockAmountUsdt": "100",
        "recipientAmountUsdt": "100",
        "refundAmountUsdt": "100"
      },
      "breakdownInput": {
        "side": "BUY",
        "tokenSymbol": "USDT",
        "fiatCurrencyId": "usd",
        "paymentMethodId": "bank_transfer",
        "savedPaymentMethodId": "account_demo",
        "amount": {
          "mode": "USDT",
          "value": "100"
        },
        "offerId": "offer_demo",
        "fingerprint": "preview_fingerprint_from_offer_search"
      },
      "calculationBasis": "REQUESTED_AMOUNT",
      "pricingSource": "partner-escrow-fee-policy",
      "pricedAt": "2026-10-23T10:00:00.000Z",
      "executable": true,
      "Card": {
        "Price": {
          "value": 1,
          "type": "fiat"
        },
        "Margin": {
          "value": 0,
          "type": "percentage"
        },
        "FiatPayment": {
          "value": 10,
          "type": "fiat"
        }
      },
      "Sheet": {
        "CryptoAmount": {
          "value": 10,
          "type": "crypto"
        },
        "MerchantRate": {
          "value": 1,
          "type": "fiat"
        },
        "Subtotal": {
          "value": 10,
          "type": "fiat"
        },
        "ServiceFee": {
          "value": 0,
          "type": "fiat"
        },
        "YouPay": {
          "value": 10,
          "type": "fiat"
        }
      }
    }
  ],
  "alternatives": [],
  "paymentMethod": {
    "_logoURL": "",
    "displayLabel": "Bank transfer",
    "id": "account_demo",
    "isActive": true,
    "paymentMethodId": "bank_transfer"
  }
}
```

**SDK Code**

```python Default
import requests

url = "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best"

payload = {
    "tokenSymbol": "USDT",
    "fiatCurrencyId": "usd",
    "paymentMethodId": "bank_transfer",
    "amount": {
        "mode": "USDT",
        "value": "100"
    },
    "side": "BUY"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Default
const url = 'https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"tokenSymbol":"USDT","fiatCurrencyId":"usd","paymentMethodId":"bank_transfer","amount":{"mode":"USDT","value":"100"},"side":"BUY"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Default
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best"

	payload := strings.NewReader("{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"USDT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"BUY\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Default
require 'uri'
require 'net/http'

url = URI("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"USDT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"BUY\"\n}"

response = http.request(request)
puts response.read_body
```

```java Default
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"USDT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"BUY\"\n}")
  .asString();
```

```php Default
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best', [
  'body' => '{
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": {
    "mode": "USDT",
    "value": "100"
  },
  "side": "BUY"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Default
using RestSharp;

var client = new RestClient("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"USDT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"BUY\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Default
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": [
    "mode": "USDT",
    "value": "100"
  ],
  "side": "BUY"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Actual amount display

**Request**

```json
{
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": {
    "mode": "USDT",
    "value": "100"
  },
  "side": "BUY",
  "displayCalculationMode": "REAL"
}
```

**Response**

```json
{
  "instant": [
    {
      "merchant": {
        "fullName": "Demo merchant",
        "avatarUrl": "https://example.com/avatar.png",
        "username": "demo_merchant",
        "ratingPercent": 98,
        "tradeCount": 1240,
        "isSuperMerchant": true,
        "experienceYears": 3
      },
      "displayCalculationMode": "REAL",
      "displayCalculationBasis": "ACTUAL_AMOUNT",
      "displayAvailable": true,
      "id": "offer_demo",
      "offerId": "offer_demo",
      "fingerprint": "preview_fingerprint_from_offer_search",
      "type": "SELL",
      "side": "BUY",
      "tokenSymbol": "USDT",
      "fiatCurrencyId": "usd",
      "fiatCurrency": {
        "id": "usd",
        "code": "USD",
        "name": "US Dollar",
        "symbol": "$",
        "decimals": 2
      },
      "catalogPaymentMethodIds": [
        "bank_transfer"
      ],
      "paymentMethods": [
        {
          "paymentMethodId": "bank_transfer",
          "displayLabel": "Bank transfer",
          "isActive": true,
          "_logoURL": "",
          "id": "account_demo"
        }
      ],
      "paymentMethod": {
        "paymentMethodId": "bank_transfer",
        "displayLabel": "Bank transfer",
        "isActive": true,
        "_logoURL": "",
        "id": "account_demo"
      },
      "pricing": {
        "merchantRateFiat": "1",
        "usdtAmount": "100",
        "customerFiatAmount": "100",
        "subtotalFiat": "100",
        "customerFeeFiat": "0",
        "platformFeeFiat": "0",
        "partnerFeeFiat": "0",
        "makerFeeUsdt": "0",
        "platformFeeUsdt": "0",
        "partnerFeeUsdt": "0",
        "lockAmountUsdt": "100",
        "recipientAmountUsdt": "100",
        "refundAmountUsdt": "100"
      },
      "breakdownInput": {
        "side": "BUY",
        "tokenSymbol": "USDT",
        "fiatCurrencyId": "usd",
        "paymentMethodId": "bank_transfer",
        "savedPaymentMethodId": "account_demo",
        "amount": {
          "mode": "USDT",
          "value": "100"
        },
        "offerId": "offer_demo",
        "fingerprint": "preview_fingerprint_from_offer_search",
        "displayCalculationMode": "REAL"
      },
      "calculationBasis": "REQUESTED_AMOUNT",
      "pricingSource": "partner-escrow-fee-policy",
      "pricedAt": "2026-10-23T10:00:00.000Z",
      "executable": true,
      "Card": {
        "Price": {
          "value": 1,
          "type": "fiat"
        },
        "Margin": {
          "value": 0,
          "type": "percentage"
        },
        "FiatPayment": {
          "value": 100,
          "type": "fiat"
        }
      },
      "Sheet": {
        "CryptoAmount": {
          "value": 100,
          "type": "crypto"
        },
        "MerchantRate": {
          "value": 1,
          "type": "fiat"
        },
        "Subtotal": {
          "value": 100,
          "type": "fiat"
        },
        "ServiceFee": {
          "value": 0,
          "type": "fiat"
        },
        "YouPay": {
          "value": 100,
          "type": "fiat"
        }
      }
    }
  ],
  "alternatives": [],
  "paymentMethod": {
    "_logoURL": "",
    "displayLabel": "Bank transfer",
    "id": "account_demo",
    "isActive": true,
    "paymentMethodId": "bank_transfer"
  }
}
```

**SDK Code**

```python Actual amount display
import requests

url = "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best"

payload = {
    "tokenSymbol": "USDT",
    "fiatCurrencyId": "usd",
    "paymentMethodId": "bank_transfer",
    "amount": {
        "mode": "USDT",
        "value": "100"
    },
    "side": "BUY",
    "displayCalculationMode": "REAL"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Actual amount display
const url = 'https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"tokenSymbol":"USDT","fiatCurrencyId":"usd","paymentMethodId":"bank_transfer","amount":{"mode":"USDT","value":"100"},"side":"BUY","displayCalculationMode":"REAL"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Actual amount display
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best"

	payload := strings.NewReader("{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"USDT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"BUY\",\n  \"displayCalculationMode\": \"REAL\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Actual amount display
require 'uri'
require 'net/http'

url = URI("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"USDT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"BUY\",\n  \"displayCalculationMode\": \"REAL\"\n}"

response = http.request(request)
puts response.read_body
```

```java Actual amount display
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"USDT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"BUY\",\n  \"displayCalculationMode\": \"REAL\"\n}")
  .asString();
```

```php Actual amount display
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best', [
  'body' => '{
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": {
    "mode": "USDT",
    "value": "100"
  },
  "side": "BUY",
  "displayCalculationMode": "REAL"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Actual amount display
using RestSharp;

var client = new RestClient("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"USDT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"BUY\",\n  \"displayCalculationMode\": \"REAL\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Actual amount display
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": [
    "mode": "USDT",
    "value": "100"
  ],
  "side": "BUY",
  "displayCalculationMode": "REAL"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### SELL / no matching offer

**Request**

```json
{
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": {
    "mode": "FIAT",
    "value": "100"
  },
  "side": "SELL"
}
```

**Response**

```json
{
  "instant": [],
  "alternatives": [],
  "paymentMethod": {
    "_logoURL": "",
    "displayLabel": "Bank transfer",
    "id": "account_demo",
    "isActive": true,
    "paymentMethodId": "bank_transfer"
  }
}
```

**SDK Code**

```python SELL / no matching offer
import requests

url = "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best"

payload = {
    "tokenSymbol": "USDT",
    "fiatCurrencyId": "usd",
    "paymentMethodId": "bank_transfer",
    "amount": {
        "mode": "FIAT",
        "value": "100"
    },
    "side": "SELL"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript SELL / no matching offer
const url = 'https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"tokenSymbol":"USDT","fiatCurrencyId":"usd","paymentMethodId":"bank_transfer","amount":{"mode":"FIAT","value":"100"},"side":"SELL"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go SELL / no matching offer
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best"

	payload := strings.NewReader("{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"FIAT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"SELL\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby SELL / no matching offer
require 'uri'
require 'net/http'

url = URI("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"FIAT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"SELL\"\n}"

response = http.request(request)
puts response.read_body
```

```java SELL / no matching offer
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"FIAT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"SELL\"\n}")
  .asString();
```

```php SELL / no matching offer
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best', [
  'body' => '{
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": {
    "mode": "FIAT",
    "value": "100"
  },
  "side": "SELL"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp SELL / no matching offer
using RestSharp;

var client = new RestClient("https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"tokenSymbol\": \"USDT\",\n  \"fiatCurrencyId\": \"usd\",\n  \"paymentMethodId\": \"bank_transfer\",\n  \"amount\": {\n    \"mode\": \"FIAT\",\n    \"value\": \"100\"\n  },\n  \"side\": \"SELL\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift SELL / no matching offer
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "tokenSymbol": "USDT",
  "fiatCurrencyId": "usd",
  "paymentMethodId": "bank_transfer",
  "amount": [
    "mode": "FIAT",
    "value": "100"
  ],
  "side": "SELL"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://us-central1-sinbad-staging-env.cloudfunctions.net/b2b-v1/v1/offers/best")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```