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

# Accept your first payment

> Accept your first USDC or USDT payment and receive local currency settlement in five steps, from sign-up to a working checkout session.

Five steps from sign-up to a working checkout.

<Steps>
  <Step title="Sign up">
    Create an account at [merchant.minisend.xyz](https://merchant.minisend.xyz) with email or Google. You'll land on your merchant dashboard.
  </Step>

  <Step title="Configure your payout">
    In **Settings**, set your business name, payout currency (KES, NGN, GHS, or UGX), and payout method (M-Pesa, mobile money, or bank). This is where Minisend sends your local currency after every successful payment.
  </Step>

  <Step title="Generate an API key">
    Open **API Keys** → **New Key**. Copy the `ms_live_...` value immediately; it's shown only once.

    <Warning>
      Never expose your API key in frontend code or public repos. Call the checkout endpoint from your backend only.
    </Warning>
  </Step>

  <Step title="Create a checkout session">
    `amount` is in USDC. The customer can pay it as USDC or USDT-equivalent.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://merchant.minisend.xyz/api/merchant/checkout \
        -H "Authorization: Bearer ms_live_your_key_here" \
        -H "Content-Type: application/json" \
        -d '{
          "amount": 25.00,
          "description": "Order #4821",
          "external_id": "order-4821"
        }'
      ```

      ```javascript JavaScript theme={null}
      const res = await fetch('https://merchant.minisend.xyz/api/merchant/checkout', {
        method: 'POST',
        headers: {
          'Authorization': 'Bearer ms_live_your_key_here',
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          amount: 25.00,
          description: 'Order #4821',
          external_id: 'order-4821',
        }),
      });

      const session = await res.json();
      // Redirect your customer to session.checkout_url
      ```
    </CodeGroup>

    Response (`201`):

    ```json theme={null}
    {
      "session_id": "cs_7f8a9b2c-...",
      "checkout_url": "https://merchant.minisend.xyz/checkout/cs_7f8a9b2c-...",
      "deposit_address": "0x1234...5678",
      "amount_usdc": 25.00,
      "expires_at": "2026-04-13T14:30:00Z",
      "status": "pending"
    }
    ```

    Sessions expire after **30 minutes** with no deposit.
  </Step>

  <Step title="Redirect and listen">
    Send the customer to `checkout_url`. They can pay in USDC on 19 chains, USDT on 14 chains, or M-Pesa (KES). When settlement completes, Minisend POSTs to your configured webhook URL:

    ```json theme={null}
    {
      "event": "checkout.completed",
      "session_id": "cs_7f8a9b2c-...",
      "amount_usdc": 25.00,
      "amount_local": 3225.00,
      "currency": "KES",
      "exchange_rate": 129.00,
      "receipt": "SHQ1234ABC",
      "status": "completed",
      "external_id": "order-4821",
      "completed_at": "2026-04-13T14:08:22Z",
      "created_at": "2026-04-13T14:00:00Z"
    }
    ```

    Or poll the [session status endpoint](/api-reference/get-checkout), which needs no authentication.
  </Step>
</Steps>
