Find the best rate.
Every time.
Click any cell in the matrix to compare banks, fintechs, remittance services, and crypto rails — including Buda, Bitso, Stellar, and Ripple ODL.
Click any cell in the matrix to compare banks, fintechs, remittance services, and crypto rails — including Buda, Bitso, Stellar, and Ripple ODL.
Live exchange rates and provider comparison data, available as a REST API. No API key required. Deploy the included server to any Node.js host.
15 minutes and refreshed by a background cron job. Every response includes a checkedAt field with the cache timestamp.npm install, then npm run dev to start on localhost:3000.vercel --prod. A vercel.json is included for zero-config deployment.| Param | Type | Description |
|---|---|---|
| fromrequired | string | ISO 4217 source currency code — e.g. USD, EUR, GBP |
| torequired | string | ISO 4217 target currency code — e.g. INR, MXN, BRL |
| Field | Type | Description |
|---|---|---|
| ok | boolean | Always true on success |
| from | string | Source currency code |
| to | string | Target currency code |
| rate | number | Mid-market exchange rate (1 unit of from in to) |
| source | string | Data provider that returned this rate — e.g. open.er-api.com |
| timestamp | string | UTC timestamp of the underlying source data |
| checkedAt | string | UTC timestamp when this response was generated / served from cache |
| Param | Type | Description |
|---|---|---|
| fromrequired | string | ISO 4217 source currency |
| torequired | string | ISO 4217 target currency |
| amountoptional | number | Amount to send in source currency. Default: 1000 |
| sortoptional | string | Sort order: rate | fee | spread. Default: rate |
| Field | Type | Description |
|---|---|---|
| ok | boolean | Always true on success |
| from / to | string | Currency pair |
| amount | number | Send amount used for calculations |
| midRate | number | Interbank mid-market rate used as baseline |
| providers | array | List of provider result objects (see below) |
| bestProvider | string | Name of the top-ranked provider for this pair |
| maxSavings | number | Difference in destination amount between best and worst provider |
| checkedAt | string | UTC timestamp when this response was generated |
| Field | Type | Description |
|---|---|---|
| rank | number | 1 = best |
| id / name | string | Provider identifier and display name |
| type | string | Category — Fintech, Bank, Crypto, etc. |
| receiveAmount | number | Destination currency amount recipient receives |
| effectiveRate | number | All-in rate after fees and spread |
| spreadPct | number | FX markup percentage (0 = mid-market) |
| totalFee | number | Total fee in source currency units |
| network / source | string | Transfer network and data source label |
| dataNote | string | Fee data provenance and date |
| Param | Type | Description |
|---|---|---|
| currenciesoptional | string | Comma-separated ISO 4217 codes. Max 10. Default: USD,EUR,GBP,JPY,CAD,MXN,INR,BRL |
| Field | Type | Description |
|---|---|---|
| ok | boolean | Always true on success |
| base | string | Pivot currency used to compute cross-rates |
| rates | object | Nested object — rates[from][to] gives the exchange rate |
| source | string | Data provider for the base rates |
| timestamp | string | UTC timestamp of the underlying source data |
Returns all supported providers with fee structures, network info, and data source metadata. No parameters required.
| Field | Type | Description |
|---|---|---|
| id | string | Machine-readable identifier — e.g. wise, paypal |
| name | string | Display name |
| type | string | Category — Fintech, Bank, Crypto, Crypto/Stablecoin |
| network | string | Transfer rail — e.g. SWIFT, SEPA, Blockchain |
| spreadPct | number | FX markup as a decimal (0.005 = 0.5%) |
| feeFixed | number | Fixed fee in source currency units |
| feePct | number | Percentage fee (0.01 = 1%) |
| feeUrl | string | URL to the official fee schedule page |
| dataNote | string | Fee data provenance, corridor, and collection date |
| supportedFrom | string | array | "any" or list of supported source currency codes |
| supportedTo | string | array | "any" or list of supported destination currency codes |
Returns stored historical mid-market rates for a currency pair, sampled every 15 minutes. History is accumulated from the first /api/refresh call and stored in Redis — up to 30 days of data.
| Param | Type | Description |
|---|---|---|
| fromrequired | string | ISO 4217 source currency code |
| torequired | string | ISO 4217 target currency code |
| daysoptional | number | Number of days of history to return. Default: 7. Max: 30 |
| Field | Type | Description |
|---|---|---|
| ok | boolean | Always true on success |
| from / to | string | Currency pair |
| days | number | Days of history requested |
| data | array | Chronological list of rate snapshots |
| data[].ts | string | ISO 8601 timestamp of this snapshot |
| data[].rate | number | Mid-market rate at this timestamp |
The Global Balance API is currently open with no enforced per-client rate limits. All responses are served from a 15-minute Redis cache to protect upstream data providers.
| Limit | Value | Notes |
|---|---|---|
| Cache TTL (fiat) | 15 min | Rates are refreshed by cron; stale data may be served until the next refresh cycle |
| Cache TTL (crypto) | 2 min | Coinbase BTC/ETH rates refresh more frequently |
| Matrix currencies | 10 max | The /api/matrix endpoint caps the currencies param at 10 codes |
| History window | 30 days | Redis list is trimmed to the last 2,880 snapshots (30d × 96 per day) |
| Vercel Hobby | ~100 req/s | Vercel's edge limits apply to the serverless functions; contact Vercel for higher tiers |
All errors return a JSON body with { "error": "..." } and an appropriate HTTP status code.
| Status | Code | Description |
|---|---|---|
| 400 | Bad Request | Missing or invalid required parameters — e.g. missing from or to |
| 404 | Not Found | Unknown route. Check the path and method. |
| 500 | Upstream Error | All upstream rate providers failed to respond. Retry after a few seconds. |
| 503 | Service Unavailable | Rate cache is cold (Redis not yet warmed). Try again after the first cron run. |
/api/history for time-series rate data (Redis-backed, 30d window). Provider list is now dynamic per currency corridor — only relevant providers appear.
Download the machine-readable API specification or import directly into Postman.
The API server is in api/index.js. Run npm install then choose a host:
Free tier, zero config. vercel.json is included — just connect your repo or drag the folder.
Connect your GitHub repo. Set start command to node api/index.js. Free tier available.
Run locally for development. npm install && npm run dev starts the server with auto-reload.