Skip to main content

Reserve Bank of India Exchange Rates for Python — rbi-exchange-rate

PyPI version Python versions license zero dependencies USD/INR today rate date

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_date on every response
  • 🔓 No key for the latest table — get_latest_rates() and get_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.typed for 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, use allratestoday-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

Latest Reserve Bank of India 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.

🧭 Reading the numbers

  • value is always quote currency per 1 unit of base currency (base: "EUR", quote: "USD", value: 1.15 means 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, flagged derived: true — never divide a published rate yourself in a compliance workflow.
  • rate_type tells you which of the central bank's series a row belongs to (reference here); 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:

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 endpoint https://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/sdk 1.4+ has officialRates('rbi') and @allratestoday/mcp-server 0.6+ has a get_official_rates tool — 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-plugin then /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 (send Content-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 as request_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:

📜 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)

Source distribution for rbi-exchange-rate 1.0.2
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)

Table of built distributions (wheels) for rbi-exchange-rate 1.0.2
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

1.0.2 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page