Public API
Remittance rates to Bangladeshi taka, ready for your app or agent. The same rates you see on this site, published as simple JSON files.
- Format
- Read-only JSON
- Access
- Free, no key
- Rates collected
- Every ~12 hours
Your first request
Choose a sending currency and fetch its rates. No account, API key, or setup required.
curl https://bdt-rates.com/api/v1/rates/gbp.jsonNeed every currency’s best rate? Start with the index:
const response = await fetch('https://bdt-rates.com/api/v1/index.json')
if (!response.ok) throw new Error(`HTTP ${response.status}`)
const { currencies } = await response.json()
for (const { currency, best_rate } of currencies) {
console.log(currency, best_rate?.provider, best_rate?.rate)
}Requests from any origin are allowed. Use the API directly from a browser or a server.
Four ways to read the data
All files use GET. Replace {currency} with a lowercase currency code.
- GETIndexOpen JSON
/api/v1/index.jsonEvery currency, its best rate, and links to the other files. Start here.
- GETRatesOpen JSON
/api/v1/rates/{currency}.jsonAll providers for one sending currency, with current rates first.
- GETHistoryOpen JSON
/api/v1/history/{currency}.jsonUp to 14 days of collected rates for each provider of one currency.
- GETOpenAPIOpen JSON
/api/v1/openapi.jsonThe OpenAPI 3.1 specification for tools and integrations.
For AI agents, llms.txt has a compact overview.
13 sending currencies, one destination
Every rate is BDT per 1 unit of the sending currency. Select a code to open its rates.
Reading a rate
Providers are listed with current quotes first, highest first, followed by older quotes and unavailable providers.
Jump to the JSON examplerankinteger- Position in the list, starting at 1.
provider_idstring- A stable identifier shared across files, such as remitly.
providerstring- The provider name, such as Remitly.
ratenumber | null- BDT received for 1 unit of the sending currency, truncated to the decimals the site shows. null means no usable quote.
statusstring- current, stale (older than 24 hours), last_known (a previous quote after a failed refresh), or unavailable.
best_rateboolean- The highest current rate, or the highest older rate when none is current.
possible_promotionalboolean- Deprecated; always false. Each provider is read for its regular rate, not a first-transfer offer.
last_updatedstring | null- When this provider’s quote was collected, in ISO 8601 format.
stale_afterstring | null- 24 hours after last_updated. Treat the quote as out of date after this time.
payout_methodsstring[]- How the recipient can be paid: Bank, Mobile Wallet, or Cash Pickup.
history_14dobject | null- Percentage change and rate range over 14 days. null when fewer than two data points are available.
{
"schema_version": 3,
"generated_at": "2026-10-20T12:45:07.265Z",
"currency": "GBP",
"unit": "BDT per 1 GBP",
"page_url": "https://bdt-rates.com/currency/gbp",
"last_updated": "2026-10-20T03:16:12.397Z",
"rates": [
{
"rank": 1,
"provider_id": "remitly",
"provider": "Remitly",
"rate": 165.69,
"status": "current",
"best_rate": true,
"possible_promotional": false,
"last_updated": "2026-10-20T03:15:30.118Z",
"stale_after": "2026-10-21T03:15:30.118Z",
"payout_methods": ["Bank", "Mobile Wallet", "Cash Pickup"],
"history_14d": { "change_pct": 0.07, "low": 165.07, "high": 165.95 }
}
],
"other_currency_pages": [{ "currency": "USD", "url": "https://bdt-rates.com/" }],
"history_url": "https://bdt-rates.com/api/v1/history/gbp.json",
"disclaimer": "Rates are collected from publicly accessible provider pages..."
}Build a picture over time
History files contain one entry per provider, with up to 14 days of collected quotes.
summary gives the latest, highest, lowest, and average rate, plus the change over the period. snapshots_oldest_first lists quotes with their timestamps, ready to plot on a chart.
Freshness & fair use
Check the quote’s time
Rates are collected about every 12 hours and served through a 60-second cache, independently of deployments. Check status and stale_after on each quote.
Fetch once, reuse the result
Poll no more than once an hour. Reuse responses and send a descriptive User-Agent. The server caches data for 60 seconds.
generated_at is when the cached response was generated. data_as_of in the index is the newest quote it contains. Providers can update at different times, so the file’s timestamp does not make every rate current.
30 requests per 10 seconds, per IP
Above the limit, requests receive HTTP 429. Wait at least 10 seconds before retrying. Downloading all 28 files once fits within one window.
Errors & compatibility
An unknown path returns HTTP 404 with a link back to the index:
{ "error": "not_found", "index_url": "/api/v1/index.json" }Fields under /api/v1 keep their meaning and are not removed. New fields may be added at any time, so ignore any you do not recognise. A change that would break existing code ships under a new path such as /api/v2. Each data file also carries a schema_version, currently 3, which identifies the shape it was built with.
Before you use a rate
Rates come from public provider pages. Fees, payment methods, and delivery methods can change the final amount received. Confirm the transfer quote with the provider. The terms of service apply to the API too.
Questions about an integration? hello@bdt-rates.com