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

# Add Mesh onramp integrations to your "Buy" lineup

By the end of this guide, you'll know how to surface Mesh's onramp integrations in your "Buy" lineup — including fetching live quotes and launching users directly into a specific provider's flow.

<Check>
  **Before you start**

  * Your core Mesh integration is working end-to-end (see [Prepare for go-live](/build/go-live))
  * You have a "Buy" or onramp flow in your app that you want to extend with Mesh integrations
</Check>

## Overview

Mesh supports multiple onramp products. If you have a "lineup" of onramps in your app, these Mesh integrations can be added directly to your UX alongside other onramps in your "Buy" flow.

## Add exchanges to the "lineup" in your "Buy" tab

**Why?**: If a user has an exchange account, there's less friction for them to buy through that account (they're already KYC'd and have added payment methods). That's in contrast to a separate provider where they have to create an account, KYC, and add payment methods. You can simply add the Mesh integration (eg. `Binance`) into your UX the same way you have other providers.

**Pro tip**: You can also pull the exchange's icon or logo from Mesh's Integrations endpoint ([/api/v1/integrations](https://docs.meshconnect.com/api-reference/managed-account-authentication/retrieve-the-list-of-all-available-integrations)) if you'd like to add that next to the exchange name in your UX.

## Use Mesh's quote API to show "You receive" quotes

**Endpoint**: [/api/v1/transfers/managed/quote](https://docs.meshconnect.com/api-reference/managed-transfers/quote-transfer)

**Why?**: This is optional and likely not necessary (if a user has an account with a certain exchange, they'll probably choose that option anyway). But if you'd like to show a "You receive" estimate for each option, you can fetch quotes using this endpoint.

<Accordion title="Quote request structure">
  <div className="parameter-reference">
    <Accordion title="Parameter reference">
      <div className="param-list">
        <div className="param-row">
          <div className="param-name"><code>X-Client-Id</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">Your Mesh Client ID.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>X-Client-Secret</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">Your Mesh API Key.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>amountInFiat</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">The base amount of the specified `fiatCurrency` to be transferred.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>fiatCurrency</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">The 3 character currency code. Only USD supported for now.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>symbol</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">Symbol of the asset being purchased.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>networkId</code> <span className="param-tag param-tag-required">required</span></div>

          <div className="param-body">
            <p>Mesh's unique identifier for the network to be used for this `toAddress`.</p>
            <p>Use the **Get networks** endpoint ([/api/v1/transfers/managed/networks](https://docs.meshconnect.com/api-reference/managed-transfers/get-networks)) to pull a list of all supported networks and the corresponding Mesh `networkId`. These values won't change, so you do not have to hit this endpoint before each Link Token request.</p>
          </div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>toAddress</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">The destination to which the specified `symbol` can be sent on the specified `networkId`.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>brokerType</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">The integration that you will wish to receive a quote from. Eg. `binanceInternationalDirect` or `coinbase`.</div>
        </div>
      </div>
    </Accordion>
  </div>

  ```bash theme={null}
  curl --request POST \
    --url https://integration-api.meshconnect.com/api/v1/transfers/managed/quote \
    --header 'Content-Type: application/json' \
    --header 'X-Client-Id: YOUR_CLIENT_ID' \ // Replace
    --header 'X-Client-Secret: YOUR_API_KEY' \ // Replace
    --data '
  {
    "amountInFiat": 99.99, // Replace
    "fiatCurrency": "USD", // Replace (only USD supported for now)
    "symbol": "ETH", // Replace
    "toAddress": "abc123", // Replace
    "networkId": "e3c7fdd8-b1fc-4e51-85ae-bb276e075611", // Ethereum, replace
    "brokerType": "binanceInternationalDirect" // Replace
  }
  '
  ```

  **Important notes**:

  * There are two quotes returned in the response: `minAmountFiat` & `maxAmountFiat`. Display **`minAmountFiat`** as the more conservative estimate — it assumes the user doesn't already hold that token and will need to fund the purchase from scratch.
  * Be sure to pay attention to the `isEligible` field in the response to know if you can show a quote (the `minEligibleAmount` & `minEligibleAmountInFiat` indicate the exchange's minimum withdrawal for that token on that network).
</Accordion>

## Launch Link directly into the chosen provider's flow

**Why?**: If the user has already selected the integration in your UX, there's no need to see the Mesh catalog. You can launch them directly into their chosen provider's flow.

<Accordion title="Link Token request structure">
  <div className="parameter-reference">
    <Accordion title="Parameter reference">
      <div className="param-list">
        <div className="param-row">
          <div className="param-name"><code>X-Client-Id</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">Your Mesh Client ID.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>X-Client-Secret</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">Your Mesh API Key.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>userId</code> <span className="param-tag param-tag-required">required</span></div>
          <div className="param-body">A unique, persistent user identifier. Personally identifiable information such as an email address or phone number should not be used. 300 characters length maximum.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>restrictMultipleAccounts</code> <span className="param-tag param-tag-optional">optional</span></div>

          <div className="param-body">
            <p>Defaults to `true`, which is standard used for any transfer flow.</p>
            <p>On some non-transfer flows (ie. "read" use cases), a user could connect multiple accounts in a row if this value were `false`. Sometimes valuable for withdrawal use cases to let the user create an external "address book".</p>
          </div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>integrationId</code> <span className="param-tag param-tag-optional">optional</span></div>

          <div className="param-body">
            <p>A unique Mesh identifier representing a specific integration.</p>
            <p>Use the **Get integrations** endpoint ([/api/v1/transfers/managed/integrations](https://docs.meshconnect.com/api-reference/managed-transfers/get-integrations)) to pull a list of integrations and the corresponding Mesh `integrationId`. These values won't change, so you do not have to hit this endpoint before each Link Token request.</p>
            <p>To be used if the user selects the integration in your UX before launching Mesh (most commonly in an `onramp` flow).</p>
          </div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.<strong>transactionId</strong></code> <span className="param-tag param-tag-optional">optional</span></div>
          <div className="param-body">A unique transaction identifier used to tie back to your data or track this transaction in future calls to Mesh.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.<strong>transferType</strong></code> <span className="param-tag param-tag-optional">optional</span></div>
          <div className="param-body">Ensures the language and flow matches your user's mental model for the type of transfer they're doing. Defaults to `deposit`.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.<strong>isInclusiveFeeEnabled</strong></code> <span className="param-tag param-tag-optional">optional</span></div>

          <div className="param-body">
            <p>Specifies if fees should be included in the amount to transfer.</p>
            <p>`false` is standard for `deposit` and `payment`, meaning any applicable fees are on top of the deposit/payment amount. `true` is standard for `onramp`, meaning the amount the user receives is the amount specified minus applicable fees.</p>
          </div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.<strong>generatePayLink</strong></code> <span className="param-tag param-tag-optional">optional</span></div>

          <div className="param-body">
            <p>When `true`, this request will return a url in addition to the Link token that can be used to launch Mesh Link in a separate web page.</p>
            <p>This should only be used if you're launching Mesh in a separate webpage (see more about "PayLinks" in the [Launch the Mesh SDK](/build/launch-sdk) guide).</p>
          </div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.<strong>amountInFiat</strong></code> <span className="param-tag param-tag-optional">optional</span></div>

          <div className="param-body">
            <p>The fiat-equivalent amount of the symbol to be purchased.</p>
            <p>To be used if the user enters an amount in your UX before launching Mesh (most commonly in an `onramp` flow).</p>
          </div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.toAddresses.<strong>networkId</strong></code> <span className="param-tag param-tag-optional">optional</span> <span className="param-tag param-tag-required">required for transfers</span></div>

          <div className="param-body">
            <p>Mesh's unique identifier for the network to be used for this `toAddress`.</p>
            <p>Use the **Get networks** endpoint ([/api/v1/transfers/managed/networks](https://docs.meshconnect.com/api-reference/managed-transfers/get-networks)) to pull a list of all supported networks and the corresponding Mesh `networkId`. These values won't change, so you do not have to hit this endpoint before each Link Token request.</p>
          </div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.toAddresses.<strong>symbol</strong></code> <span className="param-tag param-tag-optional">optional</span> <span className="param-tag param-tag-required">required for transfers</span></div>
          <div className="param-body">The symbol of the asset that can be transferred to this `toAddress`.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.toAddresses.<strong>address</strong></code> <span className="param-tag param-tag-optional">optional</span> <span className="param-tag param-tag-required">required for transfers</span></div>
          <div className="param-body">The destination to which the specified `symbol` can be sent on the specified `networkId`.</div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.toAddresses.<strong>amount</strong></code> <span className="param-tag param-tag-optional">optional</span> <span className="param-tag param-tag-required">required for payments</span></div>

          <div className="param-body">
            <p>Exact amount of the asset that should be transferred.</p>
            <p>This parameter is optional for `deposit` and `onramp`, but required when transferType: `payment`. Not to be used in combination with the `amountInFiat` field.</p>
          </div>
        </div>

        <div className="param-row">
          <div className="param-name"><code>transferOptions.toAddresses.<strong>displayAmountInFiat</strong></code> <span className="param-tag param-tag-optional">optional</span></div>

          <div className="param-body">
            <p>A fiat-equivalent amount that will be shown to the user in the Mesh UI.</p>
            <p>This ensures a consistent experience from your checkout experience to Mesh. It will only be used if is within 1% of the `amountInFiat` Mesh determines based on it pricing data. This is generally used for non-stablecoin payments, as Mesh maps stablecoins to a 1:1 price with USD for display purposes.</p>
          </div>
        </div>
      </div>
    </Accordion>
  </div>

  ```bash theme={null}
  curl --request POST \
    --url https://sandbox-integration-api.meshconnect.com/api/v1/linktoken \ // This is pointing to sandbox
    --header 'Content-Type: application/json' \
    --header 'X-Client-Id: YOUR_CLIENT_ID' \ // Replace
    --header 'X-Client-Secret: YOUR_API_KEY' \ // Replace
    --data '
  {
    "userId": "UNIQUE_USER_ID", // Replace
    "restrictMultipleAccounts": true,
    "integrationId": "5620bf49-3240-4f85-8b4f-9dd6261597e2", // Binance Connect (Replace)
    "transferOptions": {
      "transactionId": "UNIQUE_TRANSACTION_ID", // Replace
      "transferType": "onramp",
      "amountInFiat": 100.00, // Replace
      "isInclusiveFeeEnabled": true,
      "generatePayLink": false,
      "toAddresses": [ // Replace (this could be a full array, or only one destination if the user selects a token/network in your UX before launching Mesh)
        {
          "networkId": "0291810a-5947-424d-9a59-e88bb33e999d", // Solana
          "symbol": "USDC", // Replace
          "address": "xxx" // Replace
        }
      ]
    }
  }
  '
  ```
</Accordion>

## What's next

Explore the other **Extend** guides:

* [Add Mesh to your withdrawal flow](/extend/withdrawal) — enable automated address retrieval for user withdrawals.
* [Verify self-hosted wallets](/extend/verify-wallets) — add wallet ownership verification for compliance or security.

***

<Accordion title="AI coding reference (llms.txt)">
  *AI coding reference — a compact summary of this page's APIs, parameters, and patterns for use by AI coding assistants (following the [llms.txt standard](https://llmstxt.org/)). Human readers can safely ignore this.*

  **llms.txt — Add Mesh onramp integrations to your "Buy" lineup**

  Integrate exchange-based onramps into your Buy flow: surface exchanges in your lineup, optionally fetch quotes, and deep-link users directly into a chosen provider's flow.

  **Quote endpoint** (optional): `POST /api/v1/transfers/managed/quote`
  Params: `amountInFiat` | `fiatCurrency` (USD only) | `symbol` | `networkId` | `toAddress` | `brokerType`
  Response: `minAmountFiat` (show this — conservative estimate) | `maxAmountFiat` | `isEligible` | `minEligibleAmount` | `minEligibleAmountInFiat`

  **Get networkIds**: Use GET /api/v1/transfers/managed/networks to fetch the full list of supported networks and their networkId values. These values don't change — safe to cache permanently, no need to call this endpoint before every Link Token request.

  **Deep-link to provider**: Pass `integrationId` in Link Token request. Get IDs from `GET /api/v1/transfers/managed/integrations` (stable, safe to cache).

  **Link Token params for onramp**: `transferType: "onramp"` | `isInclusiveFeeEnabled: true` (user receives amount minus fees) | `amountInFiat` (if user selected amount in your UX) | `integrationId` (if user selected provider in your UX)

  **Exchange icons**: Pull `logoUrl` from `GET /api/v1/integrations` response for display in your lineup.

  **Note**: Quote API is optional — users with exchange accounts tend to self-select their preferred provider anyway.

  **Quote API — request body**:

  ```javascript theme={null}
  curl --request POST \
    --url https://integration-api.meshconnect.com/api/v1/transfers/managed/quote \
    --header 'Content-Type: application/json' \
    --header 'X-Client-Id: YOUR_CLIENT_ID' \ // Replace
    --header 'X-Client-Secret: YOUR_API_KEY' \ // Replace
    --data '
  {
    "amountInFiat": 99.99, // Replace
    "fiatCurrency": "USD", // Replace (only USD supported for now)
    "symbol": "ETH", // Replace
    "toAddress": "abc123", // Replace
    "networkId": "e3c7fdd8-b1fc-4e51-85ae-bb276e075611", // Ethereum, replace
    "brokerType": "binanceInternationalDirect" // Replace
  }
  '
  ```

  **Onramp Link Token — with provider pre-selected**:

  ```javascript theme={null}
  curl --request POST \
    --url https://sandbox-integration-api.meshconnect.com/api/v1/linktoken \ // This is pointing to sandbox
    --header 'Content-Type: application/json' \
    --header 'X-Client-Id: YOUR_CLIENT_ID' \ // Replace
    --header 'X-Client-Secret: YOUR_API_KEY' \ // Replace
    --data '
  {
    "userId": "UNIQUE_USER_ID", // Replace
    "restrictMultipleAccounts": true,
    "integrationId": "5620bf49-3240-4f85-8b4f-9dd6261597e2", // Binance Connect (Replace)
    "transferOptions": {
      "transactionId": "UNIQUE_TRANSACTION_ID", // Replace
      "transferType": "onramp",
      "amountInFiat": 100.00, // Replace
      "isInclusiveFeeEnabled": true,
      "generatePayLink": false,
      "toAddresses": [ // Replace (this could be a full array, or only one destination if the user selects a token/network in your UX before launching Mesh)
        {
          "networkId": "0291810a-5947-424d-9a59-e88bb33e999d", // Solana
          "symbol": "USDC", // Replace
          "address": "xxx" // Replace
        }
      ]
    }
  }
  '
  ```
</Accordion>
