Reserve Bank of India Exchange Rates for Python — rbi-exchange-rate
Official Reserve Bank of India exchange rates for Python. The published central bank rates behind tax filings, customs valuations, audits and compliant invoicing — not market estimates, but the numbers Reserve Bank of India itself prints, with its own rate_date on every response. The latest table needs no API key.
🚀 Why this package?
- 🏛️ Official published rates — Reserve Bank of India's own table, with the publisher's own
rate_dateon every response - 🔓 No key for the latest table —
get_latest_rates()andget_rate()work the moment the package is installed - 📅 History back to 2003 — point-in-time tables and daily series on a paid plan
- 🔀 Published vs derived, always flagged — computed inverse/cross pairs carry
derived: True, never mixed with official prints - ⚡ Zero dependencies — standard library only (
urllib), Python 3.9+ - 🔷 Typed — ships
py.typedfor mypy and pyright
Official rate, not mid-market: every value here is a number Reserve Bank of India itself published, fixed once printed — what filings and audits require. Need the live mid-market rate for pricing or display instead? Use
allratestoday. The two can diverge by several percent. For all 120+ central banks and tax authorities in one package, useallratestoday-central-bank.
📦 Installation
pip install rbi-exchange-rate
Requires Python 3.9+. No dependencies. The import name is rbi_exchange_rate.
🏁 Quick start
from rbi_exchange_rate import get_rate
pair = get_rate("USD", "INR")
print(pair["rate"], "published", pair["rate_date"]) # no API key needed
📈 Latest published table
The image is rendered live from the keyless endpoint, so it stays current on PyPI without a new release.
Source: Official rates published by Reserve Bank of India, served by AllRatesToday. Rates are as printed by the central bank; AllRatesToday is not affiliated with it.
📚 API reference
Latest published table — no key
from rbi_exchange_rate import get_latest_rates
table = get_latest_rates()
print(table["rate_date"], len(table["rates"]))
for row in table["rates"][:3]:
print(row["base"], row["quote"], row["type"], row["value"])
Returns {"bank", "rate_date", "age_days", "stale", "cadence", "rates": [{"base", "quote", "type", "value"}], "attribution"}.
One pair — no key
from rbi_exchange_rate import get_rate
pair = get_rate("USD", "INR")
pair["rate"], pair["rate_date"], pair["derived"], pair["method"]
method is published, inverse or cross; anything but published comes with derived: True.
Table for a date — paid plan
from rbi_exchange_rate import get_rates_for_date
table = get_rates_for_date("2026-01-15", api_key="art_live_...")
pair = get_rates_for_date("2026-01-15", source="USD", target="INR", api_key="art_live_...")
Weekends and holidays roll back to the last date Reserve Bank of India actually published; the returned rate_date says which.
Daily series — paid plan
from rbi_exchange_rate import get_history
series = get_history(source="USD", target="INR",
from_date="2026-01-01", to_date="2026-03-31",
api_key="art_live_...")
Billed by volume: one call per currency per month of data returned.
📖 Methods reference
| Function | Key | Returns |
|---|---|---|
get_latest_rates() |
none | Newest published table |
get_rate(source, target) |
none | One pair from it, derived flagged |
get_rates_for_date(date, source=None, target=None, api_key=None) |
paid plan | The table (or one pair) in force on a date |
get_history(symbol=None, source=None, target=None, from_date=None, to_date=None, api_key=None) |
paid plan | Date-by-date official series |
Dates accept "YYYY-MM-DD", date or datetime. Keyed calls read api_key= or the ALLRATES_API_KEY environment variable. Module constants: BANK_CODE ("rbi"), BANK_NAME, HOME_CURRENCY ("INR").
🔑 API key
The latest table is keyless. Dated tables and history need a key on a paid plan — register (free, no card), then upgrade from the dashboard.
export ALLRATES_API_KEY=art_live_...
🛡️ Error handling
Every failure raises ExchangeRateError, with the HTTP status on .status when the server answered:
from rbi_exchange_rate import get_rate, ExchangeRateError
try:
get_rate("USD", "XXX")
except ExchangeRateError as err:
print(err, err.status) # human-readable reason, e.g. 404
| Status | Meaning |
|---|---|
None |
Network error or timeout (10 s) |
401 |
Missing or invalid API key |
403 |
Your plan does not include this endpoint (dated tables and history are paid) |
404 |
No published rate for that pair or date |
429 |
Quota or rate limit reached |
🗺️ Currencies covered
Reserve Bank of India currently publishes rates covering 6 currencies against the INR (as of the latest table):
🇦🇪 AED · 🇪🇺 EUR · 🇬🇧 GBP · 🇮🇩 IDR · 🇯🇵 JPY · 🇺🇸 USD
🏛️ Source
The Reserve Bank of India (RBI) is India's central bank. Its daily reference rates for the rupee against major currencies are the standard reference for Indian accounting, tax and compliance. Since 10 July 2018 the rates have been computed and announced by Financial Benchmarks India Ltd (FBIL); the RBI continues to publish them in its Reference Rate Archive, which reaches back to 2003 and is the table served here.
- Publisher's own page: Reference rate archive · www.rbi.org.in
- Publication: every business day; the exact schedule, freshness status and any current delay are on the Reserve Bank of India rates page
- Values are stored unmodified, with the publisher's own
rate_dateon every row — see the methodology
🧭 Reading the numbers
valueis always quote currency per 1 unit of base currency (base: "EUR", quote: "USD", value: 1.15means 1 EUR = 1.15 USD).- Reserve Bank of India quotes INR per 1 unit of foreign currency (e.g.
base: "USD", quote: "INR"means INR per one US dollar). - Need the other way round? Ask
get_rate(target, source)and the API inverts or crosses for you, flaggedderived: true— never divide a published rate yourself in a compliance workflow. rate_typetells you which of the central bank's series a row belongs to (referencehere); some publishers print buy/sell or several fixings for the same pair.
⚖️ Published vs derived rates
If Reserve Bank of India does not print a pair directly, the API resolves it from the central bank's own table and says so — official and computed values are never confused:
method |
derived |
Meaning |
|---|---|---|
published |
false |
The central bank printed this pair directly |
inverse |
true |
Computed as 1 ÷ the published opposite direction |
cross |
true |
Computed via INR from two published rates |
🧩 ERP & accounting systems
Loading the official Reserve Bank of India rate into an accounting system is a supported workflow, not a hack. Step-by-step guides with the direction each system expects:
- Dynamics 365 Business Central — built-in Currency Exchange Rate Service, no code
- Xero · QuickBooks Online · SAP S/4HANA and ECC · Odoo
The same keyed endpoints return ?format=csv, ?format=xml and ?format=xlsx, and accept the key as ?api_key= on the URL for importers that cannot send headers:
curl "https://allratestoday.com/api/v1/central-bank/rbi/latest?format=xml&api_key=art_live_..."
🤖 AI agents
- MCP server:
npx -y @allratestoday/central-bank-mcp(stdio) or the hosted endpointhttps://allratestoday.com/api/mcp— tools for official rates, history, cross-bank comparison and publication calendars - Already using the general SDK or MCP server? Since 2026-10-01
@allratestoday/sdk1.4+ hasofficialRates('rbi')and@allratestoday/mcp-server0.6+ has aget_official_ratestool — both return this source's latest table with no key, so you can add it without a second dependency - Claude Code plugin (no key):
/plugin marketplace add AllRates-Today/claude-code-pluginthen/plugin install allratestoday@allratestoday— bundles both MCP servers plus an/official-rate rbi ...command - Evaluating? Agents can self-issue a trial key with no signup:
POST https://allratestoday.com/api/agent/keys(sendContent-Type: application/json) returns a 100-call key valid 7 days that covers the free-plan methods (latest table, pairs); dated tables and history need a paid plan. The MCP servers expose it asrequest_trial_key - Machine-readable site guide: llms.txt · for-ai-agents
💡 Caching tip
Reserve Bank of India publishes at most once per business day — cache get_latest_rates() for a few hours and you will rarely hit the network.
📥 Bulk data (no key)
Need the whole archive rather than an API call? The same published tables are mirrored daily as open data:
- Hugging Face: AllRatesToday/central-bank-exchange-rates — one CSV per institution (
rates/rbi.csv) - Kaggle: allratestoday/central-bank-exchange-rates
- Raw JSON on GitHub:
https://raw.githubusercontent.com/AllRates-Today/central-bank-exchange-rates/main/data/rbi/latest.json
🔗 Links
- Reserve Bank of India rates page — live table, publication cadence, FAQ
- All central bank sources
- Package docs on the site · ERP integration guides
- API documentation · Interactive reference · Methodology
- Register (Free) · Dashboard · Pricing
- Status
- GitHub
- Node.js equivalent:
rbi-exchange-rateon npm
📜 License
MIT. Rates are served as published by Reserve Bank of India; AllRatesToday is not affiliated with it.
Metadata
Release files for rbi-exchange-rate 1.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| rbi_exchange_rate-1.0.2.tar.gz | 9.3 kB | Without provenance | Details for rbi_exchange_rate-1.0.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| rbi_exchange_rate-1.0.2-py3-none-any.whl | Python 3 | none | any | Details for rbi_exchange_rate-1.0.2-py3-none-any.whl |
Total release size: 18.8 kB
Release files / rbi_exchange_rate-1.0.2.tar.gz
| Download URL | rbi_exchange_rate-1.0.2.tar.gz |
|---|---|
| Size | 9.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
46c6d2db25f3f2a4b10d504aa1bd574064b849fa2e8cefc3101872a60b2ce5af
|
|
BLAKE2b-256 checksum How to use checksums |
1d6d04a95e6079e0409a12e01d4a03da6f7be323433a91a3424f4798310c7187
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Release files / rbi_exchange_rate-1.0.2-py3-none-any.whl
| Download URL | rbi_exchange_rate-1.0.2-py3-none-any.whl |
|---|---|
| Size | 9.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
56abc432b891bce4ad986e8130552882191d8e63cba896d0f6f041e34b30b710
|
|
BLAKE2b-256 checksum How to use checksums |
08dca1fe81e6492df9116213b2effd313c95d0aae3c09e7760731935bcd05100
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Security for rbi-exchange-rate 1.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.