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

# Get started with currencies and countries

> Ask what you can open an account in, then what can deliver to a destination — in two calls.

Two reads, and by the end you will know exactly which currencies your integration can offer and what a payout to one of them needs.

```bash theme={null}
export SAKAWAVE_API_KEY='sk_test_replace_with_your_key'
export SAKAWAVE_BASE_URL='https://sandbox-api.sakawave.example'
```

## 1. Ask a narrow question

Listing every currency is rarely what you want. Filter by the capability you are about to use.

<CodeGroup>
  ```bash cURL theme={null}
  curl --request GET \
    --url "$SAKAWAVE_BASE_URL/v1/currencies?capability=account_issuance" \
    --header "Authorization: Bearer $SAKAWAVE_API_KEY"
  ```

  ```ts Node.js theme={null}
  const response = await fetch(
    `${process.env.SAKAWAVE_BASE_URL}/v1/currencies?capability=account_issuance`,
    { headers: { Authorization: `Bearer ${process.env.SAKAWAVE_API_KEY}` } },
  );

  const currencies = await response.json();
  console.log(currencies.map((currency) => currency.code));
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.get(
      f"{os.environ['SAKAWAVE_BASE_URL']}/v1/currencies",
      params={"capability": "account_issuance"},
      headers={"Authorization": f"Bearer {os.environ['SAKAWAVE_API_KEY']}"},
      timeout=30,
  )
  print([currency["code"] for currency in response.json()])
  ```
</CodeGroup>

The response is a plain array, sorted by code:

```json theme={null}
[
  {
    "code": "NGN",
    "name": "Nigerian Naira",
    "symbol": "₦",
    "minorUnits": 2,
    "accountIssuanceEnabled": true,
    "transferEnabled": true,
    "fxEnabled": true,
    "ownTransferEnabled": true,
    "tagTransferEnabled": true,
    "externalTransferEnabled": true,
    "isActive": true,
    "updatedAt": "2026-08-14T08:00:00.000Z"
  }
]
```

Two things to take from it:

1. **`minorUnits` is the number your arithmetic needs.** Store it next to every amount you handle. `2` for most currencies, `0` for UGX, `8` for crypto.
2. **The six booleans are independent.** A currency you can hold is not necessarily one you can convert. Pick the switch that matches the operation you are about to attempt.

## 2. Ask what can deliver

Now the other direction: you want to pay someone in Kenyan shillings.

```bash theme={null}
curl --request GET \
  --url "$SAKAWAVE_BASE_URL/v1/currencies/KES/routes?country=KE" \
  --header "Authorization: Bearer $SAKAWAVE_API_KEY"
```

Each route carries the `id` you will send as `routeId`, and the exact fields that route needs:

```json theme={null}
[
  {
    "id": "01K2Z3AB4M5N6P7Q8RSTVWXYZA",
    "name": "Kenya bank transfer",
    "destinationCurrency": "KES",
    "destinationCountry": "KE",
    "scheme": "pesalink",
    "paymentMethod": "bank-transfer",
    "requiredFields": ["bankCode", "accountNumber"],
    "fieldDescriptors": [
      { "key": "bankCode", "label": "Bank", "type": "select", "required": true, "options": [{ "value": "001", "label": "Example Bank" }] },
      { "key": "accountNumber", "label": "Account number", "type": "text", "required": true, "minLength": 6, "maxLength": 20 }
    ],
    "settlementTiming": "same_day",
    "minimumAmount": "10000",
    "maximumAmount": "100000000",
    "institutionDirectoryEnabled": true,
    "isDefault": true
  }
]
```

`fieldDescriptors` is the point of the call. It is a form specification: render those fields, with those labels, those constraints, and those options, and the payment detail you build from them will validate.

<Note>
  An empty array is a valid answer. The currency code is not checked against the currency list, so `[]` means "nothing delivers there", not "you asked wrongly".
</Note>

## 3. Populate the country picker

No credentials needed for this one.

```bash theme={null}
curl --request GET --url "$SAKAWAVE_BASE_URL/countries"
```

```json theme={null}
{
  "countries": [
    { "code": "NG", "code3": "NGA", "name": "Nigeria", "dialCode": "+234", "flag": "🇳🇬" }
  ],
  "count": 1
}
```

Cache it for a day — the response says so with `Cache-Control: public, max-age=86400`. Use `code` for every `jurisdiction` and `address.country` field you send.

## Which endpoint for which job

| You are… | Call |
| - | - |
| Drawing a currency picker | `GET /v1/currencies?capability=…` |
| Drawing a payout form | `GET /v1/transfer-corridors` — it resolves currency and country data too |
| Already know the currency, need `routeId` | `GET /v1/currencies/{code}/routes` |
| Drawing a country or phone-prefix picker | `GET /countries` |

## Next

* [Capabilities and corridors](/services/currencies/capabilities-and-corridors) — which switch is checked where
* [Use cases](/services/currencies/use-cases) — caching, prechecks, and driving forms


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