curl --request POST \
--url https://api.qint.ch/api/v1/merchant/balances/convert \
--header 'Content-Type: application/json' \
--cookie qint_session= \
--data '
{
"fromCurrency": "EUR",
"amount": 2400,
"idempotencyKey": "convert-eur-2026-10-20"
}
'const options = {
method: 'POST',
headers: {cookie: 'qint_session=', 'Content-Type': 'application/json'},
body: JSON.stringify({fromCurrency: 'EUR', amount: 2400, idempotencyKey: 'convert-eur-2026-10-20'})
};
fetch('https://api.qint.ch/api/v1/merchant/balances/convert', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qint.ch/api/v1/merchant/balances/convert",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'fromCurrency' => 'EUR',
'amount' => 2400,
'idempotencyKey' => 'convert-eur-2026-10-20'
]),
CURLOPT_COOKIE => "qint_session=",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}import requests
url = "https://api.qint.ch/api/v1/merchant/balances/convert"
payload = {
"fromCurrency": "EUR",
"amount": 2400,
"idempotencyKey": "convert-eur-2026-10-20"
}
headers = {
"cookie": "qint_session=",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "cv_4k8m2p9q7w1x",
"fromCurrency": "CHF",
"fromAmount": 2400,
"toCurrency": "CHF",
"toAmount": 2256.48,
"rate": 0.9402,
"rateSource": "<string>",
"rateAt": "2023-11-07T05:31:56Z",
"idempotencyKey": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"requestedByUserId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"id": "cv_4k8m2p9q7w1x",
"fromCurrency": "CHF",
"fromAmount": 2400,
"toCurrency": "CHF",
"toAmount": 2256.48,
"rate": 0.9402,
"rateSource": "<string>",
"rateAt": "2023-11-07T05:31:56Z",
"idempotencyKey": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"requestedByUserId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "An error occurred while processing your request.",
"status": 400,
"detail": "currency must be one of: CHF, EUR, USD, GBP.",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00"
}{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "An error occurred while processing your request.",
"status": 400,
"detail": "currency must be one of: CHF, EUR, USD, GBP.",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00"
}{
"title": "An error occurred while processing your request.",
"status": 409,
"detail": "Requested 2400.01 EUR but only 2400.00 EUR is available.",
"code": "insufficient_funds"
}{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "An error occurred while processing your request.",
"status": 400,
"detail": "currency must be one of: CHF, EUR, USD, GBP.",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00"
}Convert a balance
Converts a balance held in a previous Account Currency into the current Account Currency. Requires the Owner or Admin role.
- The rate is the reference rate at the time of the request, with no
fee and no spread.
toAmountisfromAmount×rate, rounded to the cent. - Only the available amount converts. Without
amount, the whole available amount offromCurrencyis converted; pending and on-hold funds stay until they become available. - The converted amount is available in the Account Currency balance at once. A conversion is final; it cannot be reversed.
- Idempotent: repeating the request with the same
idempotencyKeyfor the same currency returns the stored conversion with200instead of booking it again (201).
Not available with API keys.
curl --request POST \
--url https://api.qint.ch/api/v1/merchant/balances/convert \
--header 'Content-Type: application/json' \
--cookie qint_session= \
--data '
{
"fromCurrency": "EUR",
"amount": 2400,
"idempotencyKey": "convert-eur-2026-10-20"
}
'const options = {
method: 'POST',
headers: {cookie: 'qint_session=', 'Content-Type': 'application/json'},
body: JSON.stringify({fromCurrency: 'EUR', amount: 2400, idempotencyKey: 'convert-eur-2026-10-20'})
};
fetch('https://api.qint.ch/api/v1/merchant/balances/convert', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qint.ch/api/v1/merchant/balances/convert",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'fromCurrency' => 'EUR',
'amount' => 2400,
'idempotencyKey' => 'convert-eur-2026-10-20'
]),
CURLOPT_COOKIE => "qint_session=",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}import requests
url = "https://api.qint.ch/api/v1/merchant/balances/convert"
payload = {
"fromCurrency": "EUR",
"amount": 2400,
"idempotencyKey": "convert-eur-2026-10-20"
}
headers = {
"cookie": "qint_session=",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "cv_4k8m2p9q7w1x",
"fromCurrency": "CHF",
"fromAmount": 2400,
"toCurrency": "CHF",
"toAmount": 2256.48,
"rate": 0.9402,
"rateSource": "<string>",
"rateAt": "2023-11-07T05:31:56Z",
"idempotencyKey": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"requestedByUserId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"id": "cv_4k8m2p9q7w1x",
"fromCurrency": "CHF",
"fromAmount": 2400,
"toCurrency": "CHF",
"toAmount": 2256.48,
"rate": 0.9402,
"rateSource": "<string>",
"rateAt": "2023-11-07T05:31:56Z",
"idempotencyKey": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"requestedByUserId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "An error occurred while processing your request.",
"status": 400,
"detail": "currency must be one of: CHF, EUR, USD, GBP.",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00"
}{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "An error occurred while processing your request.",
"status": 400,
"detail": "currency must be one of: CHF, EUR, USD, GBP.",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00"
}{
"title": "An error occurred while processing your request.",
"status": 409,
"detail": "Requested 2400.01 EUR but only 2400.00 EUR is available.",
"code": "insufficient_funds"
}{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "An error occurred while processing your request.",
"status": 400,
"detail": "currency must be one of: CHF, EUR, USD, GBP.",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00"
}| HTTP | code | When |
|---|---|---|
| 400 | invalid_conversion | Unknown currency, an amount of zero or less, or a missing idempotencyKey (or one longer than 200 characters). |
| 409 | convert_same_currency | fromCurrency is the Account Currency. |
| 409 | insufficient_funds | Less is available in that balance than requested, or nothing at all. detail names both figures. |
| 409 | idempotency_key_reused | The idempotencyKey belongs to another merchant account or another currency. |
| 409 | account_currency_changed | The Account Currency changed while the conversion was being booked. Retry. |
| 503 | rate_unavailable | No reference rate right now. Try again shortly. |
Authorizations
The signed-in session of the Qint dashboard (dashboard.qint.ch). Only the Dashboard endpoints use it; API keys are not accepted there.
Headers
The merchant account to act on, for users with access to more than one. Not needed when the user belongs to a single merchant account.
Body
The fiat currency new payments are credited in (CHF unless the merchant chooses otherwise). It can change at any time; a balance in a previous Account Currency stays in that currency. Every payment is credited in the Account Currency of its quote, at the rate fixed when the buyer was quoted.
CHF, EUR, USD, GBP Required. Your unique key for this conversion. Repeating the request with the same key returns the stored conversion.
200"convert-eur-2026-10-20"
The amount to convert, in fromCurrency, kept to the cent. Omitted or null, the whole available amount of that balance.
2400
Response
A repeated request with the same idempotencyKey; the stored conversion.
A conversion of a previous-currency balance into the Account Currency.
Conversion id (cv_…).
"cv_4k8m2p9q7w1x"
The fiat currency new payments are credited in (CHF unless the merchant chooses otherwise). It can change at any time; a balance in a previous Account Currency stays in that currency. Every payment is credited in the Account Currency of its quote, at the rate fixed when the buyer was quoted.
CHF, EUR, USD, GBP The amount taken from the fromCurrency balance.
2400
The fiat currency new payments are credited in (CHF unless the merchant chooses otherwise). It can change at any time; a balance in a previous Account Currency stays in that currency. Every payment is credited in the Account Currency of its quote, at the rate fixed when the buyer was quoted.
CHF, EUR, USD, GBP The amount added to the Account Currency balance, rounded to the cent.
2256.48
Units of toCurrency per 1 unit of fromCurrency. The reference rate; no fee, no spread.
0.9402
Where the rate came from.
The time of the rate.
The dashboard user who requested it.