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

# Create quote

> Prices a transfer from one payment account to another. Each account must belong to the organization in the route or to your API key's organization. The quote and its order belong to the organization in the route, even when an account belongs to your organization, so quote under the organization you want the order reported under. Pass the quote's `quoteId` to `POST /organization/{organizationId}/order` with the same `organizationId` before `expiresAt`; a quote is valid for 2 minutes.

One side must be a wallet. Supported shapes: fiat to crypto (onramp), crypto to fiat (offramp), a same-chain swap between two wallets, and a cross-chain transfer of the same token between wallets on two supported chains. Fiat to fiat is not supported.

**Rails.** Each side moves on one rail. Omit `sourceRail` or `destinationRail` and we use the account's default rail for that direction (the rail with `isDefault: true` in the account's `rails`). When two of an account's rails tie, name the rail. The account's status for that direction on that rail must be `ready`, or the quote fails with `409` `payment-account-not-ready`.

**Assets.** Send an `asset` from [`GET /supported_assets`](/v2/api-reference/assets/list-supported-assets): a currency code such as `MXN` for a fiat side, a token's `asset` for a crypto side. Filter that list by `paymentAccountId` to see what each account can use. For a cross-chain transfer, send the token's `asset` on each chain, and pick a destination chain from the source token's `bridgeDestinations`.

**Approval.** The organization must be approved, or the quote fails with `409` `organization-not-approved`.



## OpenAPI

````yaml openapi-v2.json POST /organization/{organizationId}/quote
openapi: 3.1.0
info:
  title: Etherfuse FX API
  description: >-
    Partner-facing ramp API, version 2: payment accounts, quotes, orders and
    webhooks.
  license:
    name: Proprietary
  version: 2.0.0
servers:
  - url: https://api.sand.etherfuse.com
    description: Sandbox
security:
  - ApiKeyAuth: []
tags:
  - name: Payment Accounts
    description: >-
      Register the bank accounts and wallets that money moves from and to, and
      read their readiness per rail.
  - name: Quotes
    description: Price a transfer between two registered payment accounts.
  - name: Orders
    description: Create orders from quotes and track them.
  - name: Webhook Subscriptions
    description: Subscribe to webhook events.
  - name: Webhook Events
    description: Payloads Etherfuse sends to your webhook subscriptions.
  - name: Sandbox
    description: Endpoints that work only in sandbox, for testing.
  - name: Assets
    description: The markets and tokens a quote can use, and the balances of a wallet.
  - name: Authentication
    description: >-
      Partner JWT authentication: exchange a JWT for an access token, or launch
      a user into the app.
  - name: KYC
    description: >-
      Submit a customer's verification data, documents and questionnaire
      answers, import a verification they already passed elsewhere, and check
      where their KYC stands.
  - name: KYB
    description: Check where a business organization's KYB stands.
  - name: Lookup
    description: >-
      Public reference data: exchange rates, stablebonds, bond costs, country
      codes.
  - name: Organizations
    description: >-
      Your organization, your default partner fee, and the customer
      organizations you create.
  - name: Members
    description: >-
      The people who belong to a customer business organization and complete its
      KYB.
  - name: Statements
    description: >-
      Monthly revenue share statements for closed months, as a list or as a CSV
      or PDF download.
paths:
  /organization/{organizationId}/quote:
    post:
      tags:
        - Quotes
      summary: Create quote
      description: >-
        Prices a transfer from one payment account to another. Each account must
        belong to the organization in the route or to your API key's
        organization. The quote and its order belong to the organization in the
        route, even when an account belongs to your organization, so quote under
        the organization you want the order reported under. Pass the quote's
        `quoteId` to `POST /organization/{organizationId}/order` with the same
        `organizationId` before `expiresAt`; a quote is valid for 2 minutes.


        One side must be a wallet. Supported shapes: fiat to crypto (onramp),
        crypto to fiat (offramp), a same-chain swap between two wallets, and a
        cross-chain transfer of the same token between wallets on two supported
        chains. Fiat to fiat is not supported.


        **Rails.** Each side moves on one rail. Omit `sourceRail` or
        `destinationRail` and we use the account's default rail for that
        direction (the rail with `isDefault: true` in the account's `rails`).
        When two of an account's rails tie, name the rail. The account's status
        for that direction on that rail must be `ready`, or the quote fails with
        `409` `payment-account-not-ready`.


        **Assets.** Send an `asset` from [`GET
        /supported_assets`](/v2/api-reference/assets/list-supported-assets): a
        currency code such as `MXN` for a fiat side, a token's `asset` for a
        crypto side. Filter that list by `paymentAccountId` to see what each
        account can use. For a cross-chain transfer, send the token's `asset` on
        each chain, and pick a destination chain from the source token's
        `bridgeDestinations`.


        **Approval.** The organization must be approved, or the quote fails with
        `409` `organization-not-approved`.
      operationId: v2CreateQuote
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateQuoteRequest'
            example:
              source:
                type: stored
                id: 3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70
              destination:
                type: stored
                id: 8c1d2e3f-4a5b-4c6d-8e7f-901a2b3c4d5e
              sourceAmount: '1000'
              sourceAsset: MXN
              destinationAsset: USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN
      responses:
        '200':
          description: The quote.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quote'
        '400':
          description: >-
            `invalid-request`: the body is malformed; `sourceAmount` is not a
            positive decimal or is too small to cover the fees; a side is
            `inline` or is not registered to the organization; the pair is fiat
            to fiat, two different tokens on different chains, or uses an
            unknown or unsupported asset; the named rail cannot carry that
            direction; or two rails tie and none was named.
            `amount-out-of-range`: the amount is below the minimum or above the
            maximum of a side's rail. `sandbox-limit-exceeded`: the sandbox
            limit for onramps was exceeded.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/OrganizationNotFound'
        '409':
          description: >-
            `organization-not-approved`: the organization is not approved.
            `payment-account-disabled`: a side's account is disabled.
            `payment-account-not-ready`: a side's account is not `ready` on the
            chosen rail in that direction, is not registered on the named rail,
            or has no rail that can carry that direction.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '413':
          $ref: '#/components/responses/PayloadTooLarge'
        '422':
          description: >-
            `quote-unavailable`: we cannot price this route right now. Retry
            later. `unsupported`: the route is not supported, for example a
            principal token on a chain that does not carry it, or a cross-chain
            transfer to a chain missing from the token's `bridgeDestinations`.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    OrganizationId:
      name: organizationId
      in: path
      required: true
      description: >-
        The organization this call acts for: your API key's organization or one
        of its customer organizations. Any other id returns `404` `not-found`.
      schema:
        type: string
        format: uuid
  schemas:
    CreateQuoteRequest:
      type: object
      required:
        - source
        - destination
        - sourceAmount
        - sourceAsset
        - destinationAsset
      properties:
        source:
          $ref: '#/components/schemas/PaymentAccountRef'
        destination:
          $ref: '#/components/schemas/PaymentAccountRef'
        sourceAmount:
          type: string
          description: Amount the source sends, as a positive decimal string.
          example: '1000'
        sourceAsset:
          type: string
          description: >-
            An `asset` from `GET /supported_assets`: a currency code such as
            `MXN` for a fiat source, or a token's `asset` for a crypto source.
          example: MXN
        destinationAsset:
          type: string
          description: >-
            An `asset` from `GET /supported_assets`: a currency code for a fiat
            destination, or a token's `asset` for a crypto destination.
          example: USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN
        sourceRail:
          $ref: '#/components/schemas/PaymentRail'
          description: >-
            The rail the source moves on. Omit to use the source account's
            default rail.
        destinationRail:
          $ref: '#/components/schemas/PaymentRail'
          description: >-
            The rail the destination moves on. Omit to use the destination
            account's default rail.
        partnerFeeBpsOverride:
          type: integer
          minimum: 0
          description: >-
            Partner fee for this quote in basis points, in place of your
            organization's default partner fee. Values above 500 are capped at
            500.
    Quote:
      type: object
      required:
        - quoteId
        - sourceAmount
        - destinationAmount
        - sourceAsset
        - destinationAsset
        - sourceRail
        - destinationRail
        - rateAfterFees
        - rateBeforeFees
        - feeBps
        - feeAmount
        - fees
        - createdAt
        - expiresAt
      properties:
        quoteId:
          type: string
          format: uuid
          description: >-
            Pass to `POST /organization/{organizationId}/order`. Becomes the
            order's `id`.
        sourceAmount:
          type: string
          description: Decimal string.
        destinationAmount:
          type: string
          description: >-
            Decimal string. What the destination receives after fees. On an
            onramp into a stablebond, we price the bond at the end of the
            order's funding window, so this is slightly less than today's price
            gives. See [Fees](/v2/fees).
        sourceAsset:
          type: string
        destinationAsset:
          type: string
        sourceRail:
          $ref: '#/components/schemas/PaymentRail'
        destinationRail:
          $ref: '#/components/schemas/PaymentRail'
        rateAfterFees:
          type: string
          description: The rate the customer gets after fees, as a decimal string.
        rateBeforeFees:
          type: string
          description: The rate before our fee, as a decimal string.
        midMarketRate:
          type: string
          description: >-
            The mid-market FX rate, as a decimal string. Present only on quotes
            that convert between currencies.
        feeBps:
          type: integer
          description: Total fee in basis points.
        feeAmount:
          type: string
          description: >-
            Total fee as a decimal string, in the source asset, rounded down to
            that asset's decimals. Each line in `fees` is in its own `asset`, so
            the lines do not add up to this total when their assets differ.
        fees:
          type: array
          description: >-
            The fee lines. The order created from this quote returns the same
            lines.
          items:
            $ref: '#/components/schemas/Fee'
        createdAt:
          type: string
          format: date-time
        expiresAt:
          type: string
          format: date-time
          description: Create the order before this time. 2 minutes after `createdAt`.
    Problem:
      type: object
      description: >-
        RFC 9457 problem details. Every v2 error uses this body with content
        type `application/problem+json`. `errors` is present only on
        `validation-error`. `required` and `missing` are present only on
        `registration-info-required`.
      required:
        - type
        - title
        - status
        - detail
        - instance
      properties:
        type:
          type: string
          format: uri
          description: >-
            `https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem
            slug, for example
            `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on
            this value.
          example: https://docs.etherfuse.com/ramp/v2/errors/quote-expired
        title:
          type: string
          description: Short summary of the problem type.
          example: Quote expired
        status:
          type: integer
          description: The HTTP status code.
          example: 400
        detail:
          type: string
          description: Human-readable explanation of this occurrence. Do not parse it.
          example: >-
            quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not
            exist
        instance:
          type: string
          description: Unique identifier for this occurrence. Quote it to support.
          example: >-
            tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d
        errors:
          type: array
          description: Present on `validation-error`. One entry per invalid field.
          items:
            $ref: '#/components/schemas/FieldViolation'
        required:
          type: array
          description: >-
            Present on `registration-info-required`. Every registration field
            the route requires, as JSON Pointers into the request, for example
            `#/registrationInfo/taxId`.
          items:
            type: string
        missing:
          type: array
          description: >-
            Present on `registration-info-required`. The required fields you
            must still send, as JSON Pointers into the request.
          items:
            type: string
    PaymentAccountRef:
      description: >-
        A payment account in a quote, tagged by `type`. Use `stored` with a
        registered account's `id`. `inline` is not supported yet and returns
        `400` `invalid-request`.
      oneOf:
        - $ref: '#/components/schemas/StoredPaymentAccountRef'
        - $ref: '#/components/schemas/InlinePaymentAccountRef'
      discriminator:
        propertyName: type
        mapping:
          stored: '#/components/schemas/StoredPaymentAccountRef'
          inline: '#/components/schemas/InlinePaymentAccountRef'
    PaymentRail:
      type: string
      enum:
        - spei
        - pix
        - solana
        - base
        - polygon
        - monad
        - stellar
        - avalanche
      description: The network that moves the money. For a wallet, the rail is its chain.
    Fee:
      type: object
      required:
        - type
        - amount
        - asset
        - bps
      properties:
        type:
          $ref: '#/components/schemas/FeeType'
        amount:
          type: string
          description: Decimal string.
        asset:
          type: string
          description: The asset the fee is charged in.
        bps:
          type:
            - integer
            - 'null'
          description: >-
            The fee rate in basis points, when the fee has one. Always null on a
            quote.
    FieldViolation:
      type: object
      required:
        - pointer
        - detail
      properties:
        pointer:
          type: string
          description: >-
            JSON Pointer to the field in the request, for example
            `#/accountDetails/clabe`.
          example: '#/accountDetails/clabe'
        detail:
          type: string
          description: What is wrong with the field.
          example: This field is required.
    StoredPaymentAccountRef:
      type: object
      title: stored
      required:
        - type
        - id
      properties:
        type:
          type: string
          const: stored
        id:
          type: string
          format: uuid
          description: >-
            A payment account `id` held by the organization in the route, or by
            your own organization when the route names one of your customers.
    InlinePaymentAccountRef:
      type: object
      title: inline
      description: Not supported yet. Returns `400` `invalid-request`.
      required:
        - type
      properties:
        type:
          type: string
          const: inline
    FeeType:
      type: string
      enum:
        - transactionFee
        - partnerFee
        - walletSponsor
        - bridge
        - networkFee
        - walletSigning
      description: >-
        `networkFee` and `walletSigning` appear only on orders that move an
        embedded wallet's funds. We invoice them at cost, so they are not part
        of `feeBps`, `feeAmount` or `destinationAmount`. See [Fees and
        billing](/v2/guides/embedded-wallets#fees-and-billing).
  responses:
    Unauthorized:
      description: >-
        `unauthorized`: the `Authorization` header is missing, not ASCII, or
        does not hold a valid API key.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    OrganizationNotFound:
      description: '`not-found`: your API key cannot act for this organization.'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    PayloadTooLarge:
      description: '`payload-too-large`: the request body is too large.'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    InternalError:
      description: >-
        `internal-error`: an unexpected error on our side. Retry with backoff,
        and quote `instance` to support if it persists.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key sent in the Authorization header, with no `Bearer` prefix.

````

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