> ## 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 of the organization's payment accounts to another. Both accounts must belong to the organization in the route. 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.

**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 of the organization's payment accounts to
        another. Both accounts must belong to the organization in the route.
        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.


        **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.
          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` registered to the organization in the route.
    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
  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.