> ## 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.

# Create a payment session

> Creates a hosted crypto payment session. Returns a `payment_url` pointing to the
hosted payment page (`/pay/{uuid}`). Requires API key + KYC + business account type.

**Monthly transaction limits by plan:**
| Plan | Transactions/month |
|------|--------------------|
| Starter | 5,000 |
| Professional | 50,000 |
| Business | 500,000 |
| Enterprise | Unlimited |

Returns `402` if the subscription is expired. Returns `402` with
`"code": "TRANSACTION_LIMIT_EXCEEDED"` if the monthly cap is reached.
Limits are skipped in test/sandbox mode.




## OpenAPI

````yaml /api-reference/openapi.json post /api/v1/checkout/create
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
paths:
  /api/v1/checkout/create:
    post:
      tags:
        - Checkout (Crypto Gateway)
      summary: Create a payment session
      description: >
        Creates a hosted crypto payment session. Returns a `payment_url`
        pointing to the

        hosted payment page (`/pay/{uuid}`). Requires API key + KYC + business
        account type.


        **Monthly transaction limits by plan:**

        | Plan | Transactions/month |

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

        | Starter | 5,000 |

        | Professional | 50,000 |

        | Business | 500,000 |

        | Enterprise | Unlimited |


        Returns `402` if the subscription is expired. Returns `402` with

        `"code": "TRANSACTION_LIMIT_EXCEEDED"` if the monthly cap is reached.

        Limits are skipped in test/sandbox mode.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCheckoutRequest'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                properties:
                  amount:
                    type: number
                  currency:
                    type: string
                  expires_at:
                    format: date-time
                    type: string
                  payment_url:
                    type: string
                  session_id:
                    format: uuid
                    type: string
                  status:
                    example: pending
                    type: string
                type: object
          description: Payment session created
        '402':
          content:
            application/json:
              schema:
                properties:
                  code:
                    enum:
                      - SUBSCRIPTION_EXPIRED
                      - TRANSACTION_LIMIT_EXCEEDED
                    type: string
                  error:
                    example: >-
                      Monthly transaction limit reached. Please upgrade your
                      plan.
                    type: string
                type: object
          description: Subscription expired or monthly transaction limit reached
        '403':
          description: Individuals not allowed (business accounts only)
        '500':
          description: Service error
      security:
        - ApiKeyAuth: []
components:
  schemas:
    CreateCheckoutRequest:
      properties:
        amount:
          example: 100
          type: number
        callback_url:
          description: URL to redirect/notify on payment completion
          type: string
        currency:
          example: USD
          type: string
        customer_email:
          format: email
          type: string
        customer_name:
          type: string
        description:
          type: string
        metadata:
          additionalProperties: true
          type: object
        payment_method:
          default: crypto
          enum:
            - crypto
          type: string
        reference:
          description: Your internal order reference
          type: string
      required:
        - amount
        - currency
      type: object
  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

````