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

# LKR Offramp

> Sell stablecoin for Sri Lankan Rupees, paid out directly to a Sri Lanka bank account.

LKR offramp lets your users convert their stablecoin balance into Sri Lankan Rupees, settled to a bank account in Sri Lanka. Every offramp flow follows the same four steps: **Create User → KYC → Bank Account Linkage → Transaction.**

<Warning>
  **First-party only.** The payout bank account must belong to the KYC-verified user. User-wallet Sell is not supported yet; use Pool Sell or External Sell. Token/network availability should be confirmed for this corridor.
</Warning>

<Steps>
  <Step title="Create User">
    ```http theme={null}
    POST /api/v2/user
    ```

    ```json theme={null}
    {
      "email": "user@example.com",
      "phone": "+94771234567"
    }
    ```

    Response:

    ```json theme={null}
    {
      "success": true,
      "data": {
        "user_id": "550e8400-e29b-41d4-a716-446655440000"
      }
    }
    ```

    Save `user_id` — every subsequent call needs it as the `X-User-Id` header.
  </Step>

  <Step title="KYC">
    ```http theme={null}
    POST /api/v2/user/kyc
    ```

    Header: `X-User-Id: <user_id>`

    ```json theme={null}
    {
    "legal_name": "Nimal Perera",
    "poa": "POA-123e4e334222323223",
    "poi": "POI-1233e3422223423141",
    "country_iso3": "LKA",
    "dob": "1990-05-01",
    "gender": "M",
    "occupation": "SALARIED_EMPLOYEE",
    "income": "100000",
    "address": "25 Galle Road, Colombo 03",
    "line1": "25 Galle Road, Colombo 03",
    "state": "Western Province",
    "city": "Colombo",
    "postal_code": "00300",
    "source_of_funds": "SALARY",
    "birth_country": "LKA",
    "nationality": "LKA",
    "proof_of_identity": {
    "document_type": "PASSPORT",
    "issue_date": "2019-01-02",
    "expiry_date": "2035-12-31",
    "issuing_country": "LKA"
    },
    "proof_of_address": {
    "document_type": "NATIONAL_ID",
    "issue_date": "2018-03-04",
    "expiry_date": "2035-06-07",
    "issuing_country": "LKA"
    }
    }
    ```

    `poa` and `poi` may reference the same document. `address` and `line1` should match. `gender`, `occupation`, `income`, `state`, `postal_code`, `source_of_funds` and document issue/expiry dates are optional according to the supplied specification. All personal data above is illustrative.
  </Step>

  <Step title="Bank Account Linkage">
    ```http theme={null}
    POST /api/v2/user/bank_account
    ```

    Header: `X-User-Id: <user_id>`

    ```json theme={null}
    {
    "account_holder_name": "Nimal Perera",
    "account_number": "123456789012",
    "bank_bic": "BCEYLKLX",
    "routing_type": "bank_code",
    "country": "LKA"
    }
    ```

    | Field | Description |
    | - | - |
    | `account_holder_name` | Must match KYC legal name; first-party payouts only |
    | `account_number` | Beneficiary bank account number |
    | `bank_bic` | SWIFT / BIC code |
    | `routing_type` | `bank_code` |
    | `country` | `LKA` |

    The account number is illustrative. Confirm whether the API also requires a separate `bank_code` field; its value format has not been supplied. Save the returned `bank_id` for the sell request.
  </Step>

  <Step title="Transaction">
    Two variants, both requiring a quote first — a **Live Quote** (informational, executes at market rate regardless) or a **Locked Quote** (rate held \~30-60s, supplied as `quote_id` in the sell request):

    <Tabs>
      <Tab title="Pool Sell (recommended)">
        Get an informational quote:

        ```http theme={null}
        GET /api/v2/wallet/s/quote?from_currency=USDT&to_currency=LKR&from_amount=100
        ```

        Then create the sell:

        ```http theme={null}
        POST /api/v2/wallet/transaction/pool/sell
        ```

        ```json theme={null}
        {
          "source_id": "<bank_id>",
          "fiat_symbol": "LKR",
          "crypto_symbol": "USDT",
          "crypto_amount": 25,
          "payment_method": "bank_transfer",
          "is_first_party": true
        }
        ```
      </Tab>

      <Tab title="External Sell">
        Generate a locked quote (expires in \~30-60s):

        ```http theme={null}
        GET /api/v2/wallet/w/quote?from_currency=USDT&to_currency=LKR&network=BSC&from_amount=10
        ```

        Save `id` from the response as `quote_id`, then create the sell:

        ```http theme={null}
        POST /api/v2/wallet/transaction/crypto/sell
        ```

        ```json theme={null}
        {
          "payment_method": "bank_transfer",
          "network": "BSC",
          "destination_instrument_id": "<bank_id>",
          "quote_id": "<quote_id>",
          "sender_wallet_address": "0x318d2aae4c99c2e74f7b5949fa1c34df837789b8",
          "refund_wallet_address": "0x318d2aae4c99c2e74f7b5949fa1c34df837789b8"
        }
        ```

        Then fund `deposit_crypto_address` on-chain within the settlement expiry, and confirm it:

        ```http theme={null}
        POST /api/v2/wallet/transaction/crypto/sell/{id}/confirm-onchain-funding
        ```

        ```json theme={null}
        { "transaction_hash": "0x1234567890abcdef" }
        ```

        <Warning>
          This returns **202 Accepted**, not 200 — Saber verifies the deposit asynchronously.
        </Warning>
      </Tab>
    </Tabs>

    **Payment rail:** `bank_transfer`, all banks, up to **LKR 1,000,000 per bank payout**, with real-time processing. The sample API inputs are illustrative and do not override the limit.
  </Step>
</Steps>

## Checking status

```http theme={null}
GET /api/v2/wallet/transaction?transaction_type={POOL_SELL|EXTERNAL_SELL}&transaction_id={id}
```

| Transaction Type | Possible `status` values |
| - | - |
| Pool Sell | `CREATED`, `PROCESSING`, `COMPLETED`, `FAILED`, `CANCELLED`, `APPROVAL_REQUIRED`, `SOURCE_INVALID`, `VERIFICATION_PENDING`, `REFUND_INITIATED`, `REFUND_COMPLETED` |
| External Sell | `CREATED`, `PAYMENT_INITIATED`, `FUNDS_RECEIVED`, `COMPLETED`, `FAILED`, `REFUND_INITIATED`, `REFUND_COMPLETED`, `REFUND_FAILED` |

Poll until the status reaches a terminal state, or configure a webhook URL to receive completion pushes instead — see [Order Lifecycle and Webhooks](/offramp/operations/lifecycle).

## User limits and EDD

**Bank payouts:** All banks; maximum **LKR 1,000,000** per payout; **real-time** processing (subject to banking and operational conditions). No wallet payout rail was provided for LKR. Minimum payout amount is **USD 1 equivalent**; separate user-level limits may apply. Use [Get User Limits](/api-reference/limits/get-user-limits) for current user-level limits.

EDD is completed via the [EDD Hosted Widget](/users/limits-edd/widget), with a turnaround time of 2-3 working days.

## Related pages

<CardGroup cols={2}>
  <Card title="Offramp Operations" icon="arrow-right-arrow-left" href="/offramp/available-flows" cta="View guide" arrow="true" />

  <Card title="User KYC" icon="id-card" href="/user/kyc/overview" cta="View guide" arrow="true" />

  <Card title="Bank Account" icon="building-columns" href="/user/bank-account/overview" cta="View guide" arrow="true" />
</CardGroup>


## Related topics

- [PHP Offramp](/offramp/currencies/php.md)
- [INR Offramp](/offramp/currencies/inr.md)
- [BDT Offramp](/offramp/currencies/bdt.md)
- [IDR Offramp](/offramp/currencies/idr.md)
- [NPR Offramp](/offramp/currencies/npr.md)


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