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

# Set your WaaS transfer fee configuration

> Configures the fee you charge on every customer transfer. Rach deducts it from the transfer
amount and sends it **on-chain directly to your address** — Rach never holds it.

**A network with no address in `fee_addresses` collects no fee on that network.** Add one for
every network you want to earn on.

USD figures (`fee_cap_usd`, `flat_fee_usd`) convert to the asset at the current market rate;
stablecoins convert 1:1. On UTXO chains (BTC/LTC/BCH) the fee is an extra output in the same
transaction so `fee_tx_hash` is empty; on every other chain it is a second transaction.

> This is YOUR fee. It is separate from — and additional to — the TRON sponsorship fee Rach
> deducts on sponsored TRON USDT transfers (see the transfer endpoint).




## OpenAPI

````yaml /api-reference/openapi.json post /api/v1/wallet/fees
openapi: 3.0.3
info:
  contact:
    email: support@rachfinance.com
    name: Rach Finance Support
  description: >
    Complete REST API for the Rach Finance platform — covering authentication,
    KYC, crypto payment gateway,

    Wallet-as-a-Service (WaaS) HD wallets, remittance/FX transfers, OTC trading,
    virtual accounts,

    analytics, webhooks, push notifications, and all admin operations.


    ## Authentication

    Three authentication methods are supported depending on the endpoint group:


    | Method | Header | Used For |

    |--------|--------|----------|

    | JWT Bearer | `Authorization: Bearer <token>` | Dashboard / user-facing
    endpoints |

    | API Key | `X-API-Key: <key>` | Server-to-server integrations (remittance,
    checkout, WaaS) |

    | Admin Token | `X-Admin-Token: <token>` | Admin-only operations |


    ## API Key Environments


    Every business has two server-to-server API keys. The key **prefix is
    authoritative** —

    the environment is determined by which key you send, not a toggle in your
    dashboard:


    | Prefix | Type | Behaviour |

    |--------|------|-----------|

    | `test_sk_` | Test (sandbox) | Testnet addresses, no real funds move, no
    blockchain confirmations needed |

    | `live_sk_` | Production | Mainnet addresses, real transactions, webhooks
    fire on real confirmations |


    **Use the same code path for both environments** — swap the key, not the
    logic.

    The `is_test_mode` flag is locked onto every checkout session and wallet
    operation

    at the moment the request is authenticated, so mode cannot drift mid-flow
    even if

    you later toggle sandbox mode in the dashboard.


    Sandbox toggle (`POST /api/v1/api-keys/toggle-sandbox`) only affects legacy
    keys

    (no prefix). If you use prefixed keys it has no effect.


    ## Base URL

    `https://api.rach.finance/api/v1/`


    (Rach CaaS — Card-as-a-Service — is served separately at
    `https://api.rach.finance/caas/api/v1/`.)


    ## Official SDKs


    Client libraries covering every endpoint on this page:


    | Language | Install | Source |

    |----------|---------|--------|

    | **JavaScript / Node** | `npm install rachfinance` | `sdk/javascript/` |

    | **Python** | `pip install rachfinance` | `sdk/python/` |

    | **Go** | `go get github.com/rach-finance/rachfinance-go` | `sdk/go/` |

    | **Flutter / Dart** | add `rachfinance` to `pubspec.yaml` | `sdk/flutter/`
    |


    **JavaScript quick start:**

    ```js

    const RachFinance = require('rachfinance');

    const rach = new RachFinance({ apiKey: 'live_sk_...' });

    const session = await rach.checkout.create({ amount: 100, currency: 'USD',
      customerEmail: 'user@example.com', reference: 'ORDER-001' });
    ```


    **Python quick start:**

    ```python

    from rachfinance import RachFinance

    rach = RachFinance(api_key='live_sk_...')

    session = rach.checkout.create(amount=100, currency='USD',
        customer_email='user@example.com', reference='ORDER-001')
    ```


    **Go quick start:**

    ```go

    c, _ := rachfinance.New(rachfinance.WithAPIKey("live_sk_..."))

    session, err := c.Checkout.Create(ctx, rachfinance.CreateCheckoutRequest{
        Amount: 100, Currency: "USD",
        CustomerEmail: "user@example.com", Reference: "ORDER-001",
    })

    ```


    **Flutter quick start:**

    ```dart

    final rach = RachFinance(apiKey: 'live_sk_...');

    final session = await rach.checkout.create(
        amount: 100, currency: 'USD',
        customerEmail: 'user@example.com', reference: 'ORDER-001');
    ```


    ## Common Error Format

    ```json

    { "error": "Human-readable error message" }

    ```
  title: Rach Finance API
  version: 1.0.0
servers:
  - description: Production
    url: https://api.rach.finance
  - description: Local development
    url: http://localhost:8080
security: []
tags:
  - name: Checkout (Crypto Gateway)
  - name: WaaS (Wallet-as-a-Service)
  - description: >
      Unified token swap API for merchants. Same-chain swaps on POL/BSC are
      executed via the

      Rach FiatSwapV2 smart contract; cross-chain pairs are routed through LiFi.
      Merchants

      consume one API — routing is invisible to them.


      **Auth:** Quote is public. Execute and history require `X-API-Key`.
    name: Swap
  - description: >
      Real-time crypto market data service — included with every merchant
      account.

      Prices for 100+ coins served from Rach's edge cache with no additional
      setup required.


      **Auth:** `X-API-Key` or `Authorization: Bearer <key>`. Health check is
      public.


      **Rate limit:** 120 REST requests per merchant per minute.


      **WebSocket:** Connect to `/v1/market/ws?key=<api-key>`, send a subscribe
      message, then receive

      a snapshot immediately followed by real-time price ticks as they change.
    name: Market Data
  - name: Value-Added Services
    description: >
      Airtime and data top-ups, gift cards, and utility bill payments — one
      service over

      three product families, with one order model and one status vocabulary.


      You hold a **prepaid balance**, funded with USDT or USDC on Polygon or
      BSC, and set

      your own margin on top of the price Rach quotes you. Every purchase debits
      that

      balance before anything is spent with the provider, and a failed order is
      refunded

      automatically.


      Three rules worth knowing before you integrate:


      1. `reference` is your idempotency key and must be **reused on retries** —
      repeating
         it returns the original order rather than buying twice.
      2. Amounts are validated against each operator's real denomination rules
      before any
         money moves, so a bad amount is a clean 400.
      3. A **503** means the platform is topping up its own provider balance:
      nothing was
         attempted and you were not charged.
paths:
  /api/v1/wallet/fees:
    post:
      tags:
        - WaaS (Wallet-as-a-Service)
      summary: Set your WaaS transfer fee configuration
      description: >
        Configures the fee you charge on every customer transfer. Rach deducts
        it from the transfer

        amount and sends it **on-chain directly to your address** — Rach never
        holds it.


        **A network with no address in `fee_addresses` collects no fee on that
        network.** Add one for

        every network you want to earn on.


        USD figures (`fee_cap_usd`, `flat_fee_usd`) convert to the asset at the
        current market rate;

        stablecoins convert 1:1. On UTXO chains (BTC/LTC/BCH) the fee is an
        extra output in the same

        transaction so `fee_tx_hash` is empty; on every other chain it is a
        second transaction.


        > This is YOUR fee. It is separate from — and additional to — the TRON
        sponsorship fee Rach

        > deducts on sponsored TRON USDT transfers (see the transfer endpoint).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                is_enabled:
                  type: boolean
                  description: >-
                    Master switch. When false, no fee is collected on any
                    transfer.
                fee_mode:
                  type: string
                  enum:
                    - percentage
                    - flat
                  description: >-
                    percentage = `fee_percent` of the amount, optionally capped
                    at `fee_cap_usd`. flat = a fixed `flat_fee_usd` charge.
                fee_percent:
                  type: string
                  example: '0.005'
                  description: >-
                    A FRACTION, not a percent — "0.005" means 0.5%. Percentage
                    mode only.
                fee_cap_usd:
                  type: string
                  example: '5'
                  description: >-
                    Caps the percentage fee in USD. "0" = uncapped. Percentage
                    mode only.
                flat_fee_usd:
                  type: string
                  example: '0.50'
                  description: >-
                    Fixed USD charge, converted to the transferred asset. Flat
                    mode only.
                fee_addresses:
                  type: object
                  additionalProperties:
                    type: string
                  description: >-
                    Network code → YOUR receiving address. A network with no
                    address collects NO fee.
                  example:
                    ETH: 0xYourAddr
                    BSC: 0xYourAddr
                    TRX: TYourAddr
      responses:
        '200':
          description: Fee configuration saved
        '400':
          description: Invalid configuration (e.g. fee_percent out of range)
        '403':
          description: Fee is admin-locked and cannot be changed by the merchant
      security:
        - ApiKeyAuth: []
components:
  securitySchemes:
    ApiKeyAuth:
      description: |
        Business API key for server-to-server integrations.
        Key prefix determines the environment — no separate flag needed:
        `test_sk_*` = sandbox/testnet, `live_sk_*` = production/mainnet.
      in: header
      name: X-API-Key
      type: apiKey

````

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