Implementation guides
Public demo endpoints
Qualy provides a set of public demo endpoints that you can call directly from your marketing pages, landing pages, or student-facing websites. These let you dynamically enrich your content with live FX rate comparisons and financing simulations without setting up a backend, reverse proxy, or any server-side infrastructure.
The same data is also available through the authenticated Qualy API for use in your own applications.
Authentication
To use the demo endpoints, you need a demo integration API key. Contact us to request one.
Once you have your key, pass it in the Authorization header with every request:
Authorization: ApiKey pk_demo_integration_xxxx
Authenticated API
These same endpoints are also available at https://api.qualyhq.com using standard API key authentication with an Authorization and X-TENANT-ID header. The response format is identical.
FX rates
Aggregates foreign exchange rates from multiple providers and returns them ranked by competitiveness. Use this to display a rate comparison widget showing which provider offers the best conversion rate.
Endpoint
GET https://demos.qualyhq.com/fx-rates
Request parameters
| Parameter | Type | Description |
|---|---|---|
sourceAmount | number (required) | The amount to convert, in the source currency's minor unit (cents). For example, 50000 for 500.00 BRL. |
sourceCurrency | string (required) | ISO 4217 currency code for the source currency. For example, BRL. |
targetCountry | string (required) | ISO 3166-1 alpha-2 country code for the country where the money is being sent to. For example, BR for Brazil. |
targetCurrency | string (required) | ISO 4217 currency code for the target currency. For example, AUD. |
Example request
// Using your demo integration key
const params = new URLSearchParams({
sourceAmount: '50000',
sourceCurrency: 'BRL',
targetCountry: 'BR',
targetCurrency: 'AUD',
});
const response = await fetch(
`https://demos.qualyhq.com/fx-rates?${params.toString()}`,
{
headers: {
'Authorization': 'ApiKey pk_demo_integration_xxxx',
},
}
);
const result = await response.json();
console.log(result);
Response structure
The response returns a data object where each key is a gateway (provider) name, containing rate details and provider metadata.
{
"data": {
"qualy": {
"gateway": "qualy",
"targetAmount": 23456.78,
"rate": 2.1234,
"comparison": {
"rank": 1,
"isBestRate": true,
"differencePercentage": 0
},
"provider": {
"name": "Qualy",
"logos": {
"normal": {
"svgUrl": "https://...",
"pngUrl": "https://..."
}
}
}
},
"wise": {
"gateway": "wise",
"targetAmount": 23100.00,
"rate": 2.1050,
"comparison": {
"rank": 2,
"isBestRate": false,
"differencePercentage": -0.87
},
"provider": {
"name": "Wise",
"logos": {
"normal": {
"svgUrl": "https://...",
"pngUrl": "https://..."
}
}
}
}
}
}
Response fields
| Field | Type | Description |
|---|---|---|
gateway | string | Internal identifier for the provider. |
targetAmount | number | The converted amount the recipient would receive in the target currency. |
rate | number | The exchange rate applied for this provider. |
comparison.rank | number | Ranking position among all providers (1 = best). |
comparison.isBestRate | boolean | Whether this provider offers the best rate. |
comparison.differencePercentage | number | Percentage difference compared to the best rate. Negative means worse. |
provider.name | string | Display name of the provider. |
provider.logos.normal.svgUrl | string or null | URL to the provider's SVG logo, if available. |
provider.logos.normal.pngUrl | string or null | URL to the provider's PNG logo, if available. |
Providers
Not all providers return logos. Some providers do not have logos available, so your UI should handle this gracefully (e.g. by showing the provider name as a text fallback).
| Gateway | Display name | Has logo |
|---|---|---|
qualy | Qualy | Yes |
transfermate | TransferMate | Yes |
xe | XE | Yes |
wise | Wise | Yes |
edwallet | EdWallet | No |
nexpay | Nexpay | No |
abraseeio | Abraseeio | No |
Displaying a single rate
If you don't want to show a competitive comparison between providers, use the qualy provider entry from the response. This represents the rate that Qualy is able to offer and can be displayed on its own as "your" exchange rate — without needing to reference other providers.
Supported currencies
The endpoint supports 26+ currencies including: AUD, BRL, EUR, GBP, USD, CAD, NZD, CHF, CNY, JPY, INR, KRW, HKD, SGD, TWD, VND, COP, MXN, CLP, ARS, PEN, PLN, DKK, SEK, NOK, TRY, ZAR, and AED.
Financing simulation
Returns available installment plans for a given amount, showing how a payment can be split into multiple installments along with any applicable interest rates.
Endpoint
GET https://demos.qualyhq.com/financing-rates
Request parameters
| Parameter | Type | Description |
|---|---|---|
amount | number (required) | The total amount in cents. For example, 100000 for R$1,000.00. |
currency | string (required) | ISO 4217 currency code. Currently supports BRL. |
gateway | string (required) | The payment gateway to simulate with. For example, pagbank. |
method | string (required) | The payment method identifier for the gateway. For example, PGBNK_CC for PagBank credit card. |
Example request
// Using your demo integration key
const amountInCents = 1000000; // R$10,000.00
const response = await fetch(
`https://demos.qualyhq.com/financing-rates?amount=${amountInCents}¤cy=BRL&gateway=pagbank&method=PGBNK_CC`,
{
headers: {
'Authorization': 'ApiKey pk_demo_integration_xxxx',
},
}
);
const result = await response.json();
console.log(result);
Response structure
The response returns an array of installment simulations, each representing a different payment plan option.
{
"success": true,
"data": {
"simulations": [
{
"nInstallments": 1,
"installmentAmount": 100000,
"total": 100000,
"interestRate": 0,
"feePercentage": 0,
"gateway": "pagbank",
"method": "PGBNK_CC"
},
{
"nInstallments": 3,
"installmentAmount": 34500,
"total": 103500,
"interestRate": 0.035,
"feePercentage": 0.035,
"gateway": "pagbank",
"method": "PGBNK_CC"
},
{
"nInstallments": 6,
"installmentAmount": 18200,
"total": 109200,
"interestRate": 0.092,
"feePercentage": 0.092,
"gateway": "pagbank",
"method": "PGBNK_CC"
}
]
}
}
Response fields
| Field | Type | Description |
|---|---|---|
nInstallments | number | Number of installments (1 = lump sum payment). |
installmentAmount | number | Amount per installment, in cents. |
total | number | Total amount to be paid across all installments, in cents. |
interestRate | number | Interest rate as a decimal. For example, 0.035 means 3.5%. A value of 0 means interest-free. |
feePercentage | number | Fee percentage applied to the total. May be used as an alternative to interestRate. |
gateway | string | The payment gateway handling this financing option. |
method | string | The payment method (e.g., PGBNK_CC). |
Error handling
When the request fails, the endpoint returns a 400 Bad Request HTTP status code.
Things to know
- Amounts are always in cents (minor currency unit). Divide by 100 for display.
- The 1-installment option represents a lump sum (full amount, no interest).
- Interest rates vary by installment count — more installments typically means a higher rate.
- This endpoint currently supports BRL (Brazilian Real) only.