# Public demo endpoints

> Embeddable API endpoints for FX rate comparisons and financing simulations — no backend or reverse proxy required.

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](https://qualyhq.com/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
```

> **Note — Authenticated API**
>
> These same endpoints are also available at `https://api.qualyhq.com` using standard [API key authentication](/docs/authentication.md) 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

```javascript
// 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.

```json
{
  "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 |

> **Note — 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

```javascript
// Using your demo integration key
const amountInCents = 1000000; // R$10,000.00

const response = await fetch(
  `https://demos.qualyhq.com/financing-rates?amount=${amountInCents}&currency=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.

```json
{
  "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.
