Official Python client for the Unirate API - real-time and historical currency exchange rates, plus VAT rates
Project description
Unirate Python API Client
A comprehensive Python client for the Unirate API - providing free, real-time and historical currency exchange rates, plus VAT rates.
Features
- 🔄 Real-time exchange rates - Get current currency conversion rates
- 📈 Historical data - Access historical exchange rates for any date (1999-2025)
- ⏰ Time series data - Retrieve exchange rate data over date ranges (max 5 years)
- 💰 Currency conversion - Convert amounts between currencies (current and historical)
- 🏛️ VAT rates - Get VAT rates for countries worldwide
- 📊 Multiple output formats - JSON, XML, CSV, TSV support
- 🌍 170+ currencies supported - Including cryptocurrencies
- 🆓 Completely free - No credit card required
- 🚀 Easy to use - Simple, intuitive API
Installation
pip install unirate-api
Quick Start
from unirate import UnirateClient
# Initialize the client
client = UnirateClient('your-api-key-here')
# Get current exchange rate
rate = client.get_rate('USD', 'EUR')
print(f'USD to EUR rate: {rate}')
# Convert currency (note: to_currency is first parameter)
amount = client.convert('EUR', 100, 'USD')
print(f'100 USD = {amount} EUR')
# Get supported currencies
currencies = client.get_supported_currencies()
print(f'Supported currencies: {len(currencies)}')
API Methods
Current Rates & Conversion
get_rate(from_currency='USD', to_currency=None, format='json', callback=None)
Get current exchange rates. If to_currency is omitted, returns rates for all currencies.
# Single currency rate
rate = client.get_rate('USD', 'EUR')
# All rates for base currency
all_rates = client.get_rate('USD')
# Get rates in CSV format
csv_data = client.get_rate('USD', 'EUR', format='csv')
convert(to_currency, amount=1, from_currency='USD', format='json', callback=None)
Convert an amount from one currency to another using current rates.
# Convert with default amount (1)
converted = client.convert('EUR', from_currency='USD')
# Convert specific amount
converted = client.convert('EUR', 100, 'USD')
# Get conversion result in XML format
xml_result = client.convert('EUR', 100, 'USD', format='xml')
get_supported_currencies(format='json', callback=None)
Get a list of all supported currency codes.
currencies = client.get_supported_currencies()
# Get currencies in CSV format
csv_currencies = client.get_supported_currencies(format='csv')
Historical Data
get_historical_rate(date, amount=1, from_currency='USD', to_currency=None, format='json', callback=None)
Get historical exchange rates for a specific date. If to_currency is omitted, returns rates for all currencies.
# Single currency historical rate
rate = client.get_historical_rate('2024-01-01', from_currency='USD', to_currency='EUR')
# All historical rates for base currency
all_rates = client.get_historical_rate('2024-01-01', from_currency='USD')
# Historical conversion with amount
converted = client.get_historical_rate('2024-01-01', amount=100, from_currency='USD', to_currency='EUR')
get_historical_rates(date, amount=1, base_currency='USD', format='json', callback=None)
Alias for get_historical_rate to get all exchange rates for a base currency on a specific date.
rates = client.get_historical_rates('2024-01-01', base_currency='USD')
convert_historical(amount, from_currency, to_currency, date, format='json', callback=None)
Convert an amount using historical exchange rates for a specific date.
converted = client.convert_historical(100, 'USD', 'EUR', '2024-01-01')
get_time_series(start_date, end_date, amount=1, base_currency='USD', currencies=None, format='json', callback=None)
Get time series exchange rate data over a date range (max 5 years).
# Time series for specific currencies
time_series = client.get_time_series(
'2024-01-01',
'2024-01-07',
base_currency='USD',
currencies=['EUR', 'GBP']
)
# Time series for all currencies
all_series = client.get_time_series('2024-01-01', '2024-01-07', base_currency='USD')
# Time series with amount conversion
converted_series = client.get_time_series(
'2024-01-01',
'2024-01-07',
amount=100,
base_currency='USD',
currencies=['EUR']
)
New Features
get_historical_limits(format='json', callback=None)
Get information about available historical data limits per currency.
limits = client.get_historical_limits()
print(f"Total currencies with historical data: {limits['total_currencies']}")
for currency, info in limits['currencies'].items():
print(f"{currency}: {info['earliest_date']} to {info['latest_date']}")
get_vat_rates(country=None, format='json', callback=None)
Get VAT rates for all countries or a specific country.
# Get all VAT rates
all_vat = client.get_vat_rates()
print(f"Total countries: {all_vat['total_countries']}")
# Get VAT rate for specific country
germany_vat = client.get_vat_rates('DE')
vat_info = germany_vat['vat_data']
print(f"Germany VAT rate: {vat_info['vat_rate']}%")
# Get VAT rates in CSV format
csv_vat = client.get_vat_rates(format='csv')
Output Formats
All methods support multiple output formats:
json(default) - Returns Python dict/listxml- Returns XML stringcsv- Returns CSV stringtsv- Returns TSV string
# JSON (default)
json_data = client.get_rate('USD', 'EUR')
# XML format
xml_data = client.get_rate('USD', 'EUR', format='xml')
# CSV format
csv_data = client.get_rate('USD', 'EUR', format='csv')
# TSV format
tsv_data = client.get_rate('USD', 'EUR', format='tsv')
JSONP Support
For JSON responses, you can specify a JSONP callback function:
jsonp_data = client.get_rate('USD', 'EUR', callback='myCallback')
Complete Example
from unirate import UnirateClient
def main():
client = UnirateClient('your-api-key-here')
try:
print('=== Current Rates ===')
# Current exchange rate
rate = client.get_rate('USD', 'EUR')
print(f'Current USD to EUR: {rate}')
# All rates for USD
all_rates = client.get_rate('USD')
print(f'EUR: {all_rates["EUR"]}, GBP: {all_rates["GBP"]}')
# Currency conversion
converted = client.convert('EUR', 1000, 'USD')
print(f'1000 USD = {converted} EUR')
print('\n=== Historical Data ===')
# Historical rate
historical_rate = client.get_historical_rate('2024-01-01', from_currency='USD', to_currency='EUR')
print(f'USD to EUR on 2024-01-01: {historical_rate}')
# Historical conversion
historical_converted = client.convert_historical(1000, 'USD', 'EUR', '2024-01-01')
print(f'1000 USD = {historical_converted} EUR (on 2024-01-01)')
# Time series data
time_series = client.get_time_series(
'2024-01-01', '2024-01-05',
base_currency='USD',
currencies=['EUR', 'GBP']
)
print('USD time series:')
for date, rates in time_series.items():
print(f' {date}: EUR={rates["EUR"]}, GBP={rates["GBP"]}')
print('\n=== New Features ===')
# Historical limits
limits = client.get_historical_limits()
print(f'Total currencies: {limits["total_currencies"]}')
# VAT rates
vat_rates = client.get_vat_rates()
print(f'Total countries with VAT: {vat_rates["total_countries"]}')
# Germany VAT
germany_vat = client.get_vat_rates('DE')
print(f'Germany VAT: {germany_vat["vat_data"]["vat_rate"]}%')
print('\n=== Format Examples ===')
# CSV format
csv_data = client.get_rate('USD', 'EUR', format='csv')
print('CSV format:', csv_data[:50] + '...')
except Exception as e:
print(f'Error: {e}')
if __name__ == '__main__':
main()
Error Handling
The client provides specific exception types for different error scenarios:
from unirate import UnirateClient
from unirate.exceptions import (
UnirateError,
AuthenticationError,
RateLimitError,
InvalidCurrencyError,
InvalidDateError,
APIError
)
client = UnirateClient('your-api-key')
try:
rate = client.get_rate('USD', 'INVALID')
except AuthenticationError:
print('Invalid API key')
except InvalidCurrencyError:
print('Invalid currency code')
except RateLimitError:
print('Rate limit exceeded')
except InvalidDateError:
print('Invalid date format')
except APIError as e:
print(f'API Error: {e} (Status: {e.status_code})')
except UnirateError as e:
print(f'General API Error: {e}')
Rate Limits
- Currency endpoints: Standard rate limits apply
- Historical endpoints: 50 requests per hour
- VAT endpoints: 1800 requests per hour
API Key
Get your free API key from https://unirateapi.com. No credit card required!
Supported Currencies
The API supports 170+ currencies including:
- Traditional currencies: USD, EUR, GBP, JPY, CAD, AUD, etc.
- Cryptocurrencies: BTC, ETH, LTC, and many more
Use get_supported_currencies() to get the complete list.
Historical Data Coverage
Historical data is available from 1999 to 2025, with coverage varying by currency:
- Major currencies: Full coverage from 1999-01-01
- Some currencies: Limited historical data (use
get_historical_limits()to check)
Requirements
- Python 3.7+
- requests
Changelog
Version 1.0.0
- NEW: VAT rates endpoint (
get_vat_rates()) - NEW: Historical limits endpoint (
get_historical_limits()) - NEW: Multiple output formats (JSON, XML, CSV, TSV)
- NEW: JSONP callback support
- BREAKING: Updated method signatures with optional parameters and defaults
- BREAKING:
convert()method parameter order changed (to_currencyfirst) - BREAKING: Historical methods now require
dateas first parameter - IMPROVED: Better error handling with specific exception types
- IMPROVED: Enhanced response parsing for new API structure
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file unirate_api-1.0.0.tar.gz.
File metadata
- Download URL: unirate_api-1.0.0.tar.gz
- Upload date:
- Size: 9.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a4b1bc5f5617fc1b15a66da9819b0f66cc928e5ac27c903a3e543d658e8577cc
|
|
| MD5 |
4846b57a7d77a05e0a80778a4da11e20
|
|
| BLAKE2b-256 |
4702c456f1dec869e3404587e7bb13fa17177615334c043357136316e5cffc60
|
File details
Details for the file unirate_api-1.0.0-py3-none-any.whl.
File metadata
- Download URL: unirate_api-1.0.0-py3-none-any.whl
- Upload date:
- Size: 7.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
953bfefcc3abdff3224bcab5e6ef65e561d8db3f4b7efb13c8f4a74d12db22a4
|
|
| MD5 |
64ee6975a9228a39656238e437122339
|
|
| BLAKE2b-256 |
bed9a0758ba507fc1156363167156777e22ba59827701f1ca63ebb71041b8870
|