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

# Get a quote

> Returns a live exchange-rate quote for a USD → foreign currency payout, including fees and estimated delivery time.

The quoted `sourceAmount` is cached server-side for 5 minutes. The response includes a `quoteId` that you must pass to `POST /api/payouts/transfer` or `POST /api/payouts/transfer/v2` within that window.

**v2-offloader accounts:** Pass `v2_offloader=true` to receive fees calculated for the v2 transfer pipeline. `serviceFeePercent` will reflect the combined platform fee (your configured fee + 20 bips for the offloader). `serviceFeeFixed` will be 0. `providerCharge` is absent. The fee fields are display-only — the platform deducts the correct amounts at settlement time.

**Rate limit:** 20 requests/minute.



## OpenAPI

````yaml /openapi.json get /api/payouts/quote
openapi: 3.0.3
info:
  title: MW Payouts API
  version: 1.0.0
  description: >-
    The MW Payouts API lets you programmatically retrieve exchange-rate quotes,
    calculate platform fees, and submit USDC-to-fiat payout transfers on behalf
    of your account.


    All requests must be authenticated with an API key obtained from the
    **Developers** section of the dashboard. API keys are for **server-side use
    only** — never embed them in client-side code.
  contact:
    name: MW Support
    email: support@madhousewallet.com
servers:
  - url: https://business.madhousewallet.com
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Payouts
    description: USDC-to-fiat payout operations
  - name: Recipients
    description: Payout recipient management
paths:
  /api/payouts/quote:
    get:
      tags:
        - Payouts
      summary: Get a quote
      description: >-
        Returns a live exchange-rate quote for a USD → foreign currency payout,
        including fees and estimated delivery time.


        The quoted `sourceAmount` is cached server-side for 5 minutes. The
        response includes a `quoteId` that you must pass to `POST
        /api/payouts/transfer` or `POST /api/payouts/transfer/v2` within that
        window.


        **v2-offloader accounts:** Pass `v2_offloader=true` to receive fees
        calculated for the v2 transfer pipeline. `serviceFeePercent` will
        reflect the combined platform fee (your configured fee + 20 bips for the
        offloader). `serviceFeeFixed` will be 0. `providerCharge` is absent. The
        fee fields are display-only — the platform deducts the correct amounts
        at settlement time.


        **Rate limit:** 20 requests/minute.
      operationId: getPayoutQuote
      parameters:
        - name: targetCurrency
          in: query
          required: true
          schema:
            type: string
          description: >-
            ISO 4217 target currency code. Supported currencies (81): AED, ALL,
            ARS, AUD, BAM, BDT, BHD, BMD, BOB, BRL, BWP, CAD, CHF, CLP, CNY,
            COP, CRC, CVE, CZK, DKK, DOP, EGP, EUR, GBP, GEL, GHS, GMD, GNF,
            GTQ, HKD, HNL, HUF, IDR, ILS, INR, ISK, JPY, KES, KGS, KHR, KRW,
            KWD, LAK, LKR, MAD, MNT, MOP, MUR, MXN, MYR, NAD, NGN, NIO, NOK,
            NPR, NZD, OMR, PEN, PHP, PKR, PLN, PYG, QAR, RON, RSD, RWF, SAR,
            SCR, SEK, SGD, SRD, THB, TND, TRY, TZS, UAH, UGX, USD, UYU, VND,
            ZAR.
          example: EUR
        - name: sourceAmount
          in: query
          required: true
          schema:
            type: number
            minimum: 0.01
            maximum: 1000000
          description: USD amount to convert
          example: 100
        - name: v2_offloader
          in: query
          required: false
          schema:
            type: string
            enum:
              - 'true'
          description: >-
            Pass `true` to receive fee fields calculated for the v2 transfer
            pipeline (POST /api/payouts/transfer/v2). When set,
            `serviceFeePercent` reflects your configured fee + 20 bips,
            `serviceFeeFixed` is 0, and `providerCharge` is absent. Ignored for
            non-API-key callers.
          example: 'true'
      responses:
        '200':
          description: Quote generated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteResponse'
              examples:
                v1_spherepay:
                  summary: v1 account
                  value:
                    quoteId: 281901c4-19c6-462f-9c81-37fc6bbde340
                    sourceAmount: 1000
                    providerCharge: 2
                    serviceFeePercent: 1.5
                    targetCurrency: EUR
                    usdToTargetRate: 0.9183
                    quote:
                      targetAmount: 915.28
                      transferFee: 0.58
                      feeFxPercent: 0
                      feeFxAmount: 0
                      feePayoutAmount: 0.58
                      estimatedDelivery: '2026-03-26T15:52:37Z'
                v2_offloader:
                  summary: v2-offloader account (v2_offloader=true)
                  value:
                    quoteId: 4d0c2a5d-940b-4759-861f-4d660e5ae492
                    sourceAmount: 100
                    serviceFeePercent: 0.6
                    serviceFeeFixed: 0
                    targetCurrency: KES
                    usdToTargetRate: 129.6
                    quote:
                      targetAmount: 12274
                      transferFee: 3.98
                      feeFxPercent: 1.15
                      feeFxAmount: 1.83
                      feePayoutAmount: 2.15
                      estimatedDelivery: '2026-05-26T03:24:37Z'
        '400':
          description: Invalid parameters or unsupported currency
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limit exceeded (20 requests/minute per key)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    QuoteResponse:
      type: object
      properties:
        providerCharge:
          type: number
          description: >-
            Provider processing fee in USD deducted from the source amount
            before conversion. Present only for v1 accounts; absent for
            v2-offloader accounts.
          example: 2
        serviceFeePercent:
          type: number
          description: >-
            Combined platform service fee displayed as a percentage (e.g. 0.6
            means 0.6%). 0 when not configured.
          example: 0.6
        serviceFeeFixed:
          type: number
          nullable: true
          description: >-
            Fixed fee in USD (display only). Always 0 for v2-offloader accounts.
            Absent when not applicable.
          example: 0
        targetCurrency:
          type: string
          description: ISO 4217 currency code of the payout destination (uppercased).
          example: EUR
        usdToTargetRate:
          type: number
          description: Exchange rate from 1 USD to the target currency.
          example: 0.9183
        quote:
          type: object
          description: Settlement layer quote details — fees and estimated delivery.
          properties:
            targetAmount:
              type: number
              nullable: true
              description: Amount the recipient will receive in the target currency.
              example: 915.28
            transferFee:
              type: number
              nullable: true
              description: >-
                Settlement layer transfer fee charged by the settlement provider
                (deducted from target amount). Equals feeFxAmount +
                feePayoutAmount when the breakdown is available.
              example: 0.58
            feeFxPercent:
              type: number
              nullable: true
              description: >-
                FX conversion fee as a percentage (e.g. 0.72 means 0.72%). The
                FX component of transferFee is this percent applied to the
                converted amount. Null when a breakdown is not available (e.g.
                unsupported corridor or email recipient).
              example: 0.47
            feeFxAmount:
              type: number
              nullable: true
              description: >-
                FX conversion fee component of transferFee, in USD. Null when a
                breakdown is not available.
              example: 0.34
            feePayoutAmount:
              type: number
              nullable: true
              description: >-
                Flat payout fee component of transferFee, in USD. Null when a
                breakdown is not available.
              example: 0.24
            estimatedDelivery:
              type: string
              nullable: true
              description: Estimated delivery timestamp (ISO 8601).
              example: '2026-03-26T15:50:39Z'
        quoteId:
          type: string
          description: >-
            UUID identifying this quote — pass to POST /api/payouts/transfer or
            POST /api/payouts/transfer/v2 as `quote_id` (API key callers only;
            absent for JWT callers). Valid for 5 minutes, single-use.
          example: 3f7a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c
        sourceAmount:
          type: number
          description: Original USD input amount (before any fee deductions).
          example: 1000
      required:
        - serviceFeePercent
        - serviceFeeFixed
        - targetCurrency
        - usdToTargetRate
        - quote
        - quoteId
        - sourceAmount
    Error:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message
      required:
        - error
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Pass your API key as a Bearer token: `Authorization: Bearer
        mw_live_<keyId>_<secret>`

````