Overview
The latest rates endpoint returns current exchange rates for all currencies supported by the Reserve Bank of Australia. Rates are updated daily at 4:00 PM AEST and cached for optimal performance.
This endpoint requires authentication. Get your API key to start making requests.
Authentication
Bearer token with your API key: Bearer your_api_key_here
Query Parameters
Comma-separated list of currency codes to filter results (case-insensitive). If omitted, all available currencies are returned. Examples: USD,EUR,GBP, JPY,CAD,NZD
Base currency for the rates. Currently only AUD is supported. Default: AUD
Request
cURL - All Currencies
cURL - Specific Currencies
JavaScript - All Currencies
JavaScript - Filtered Currencies
Python
PHP
curl https://api.exchangeratesapi.com.au/latest \
-H "Authorization: Bearer your_api_key_here"
Response
{
"success" : true ,
"timestamp" : 1725080400 ,
"base" : "AUD" ,
"date" : "2025-08-31" ,
"rates" : {
"USD" : 0.643512 ,
"EUR" : 0.562934 ,
"GBP" : 0.487421 ,
"JPY" : 96.832100 ,
"NZD" : 1.094200 ,
"CAD" : 0.893421 ,
"CHF" : 0.578234 ,
"CNY" : 4.623451 ,
"KRW" : 854.721000 ,
"SGD" : 0.856789 ,
"INR" : 54.123456 ,
"THB" : 22.567890 ,
"MYR" : 2.987654 ,
"IDR" : 9876.543210 ,
"VND" : 15432.109876 ,
"HKD" : 5.012345 ,
"PHP" : 36.789012 ,
"TWD" : 20.456789 ,
"TWI" : 60.500000 ,
"SDR" : 0.476543
}
}
Always true for successful responses
Unix timestamp when the rates were published by RBA
Base currency for all rates (always “AUD”)
Date when the rates were published (YYYY-MM-DD format)
Object containing exchange rates keyed by currency code
Exchange rate from AUD to the specified currency, with precision varying by currency (up to 6 decimal places for most, whole numbers for IDR/VND)
Understanding Exchange Rates
Rate Interpretation
All rates are quoted as AUD to foreign currency :
"USD": 0.643512 means 1 AUD = 0.643512 USD
"EUR": 0.562934 means 1 AUD = 0.562934 EUR
"JPY": 96.832100 means 1 AUD = 96.832100 JPY
Precision
Rates are stored with micro-unit precision internally
API responses show up to 6 decimal places (varies by currency)
Actual precision varies by currency based on RBA source data:
Most currencies: Up to 6 decimal places (e.g., USD: 0.6566)
Some currencies: 2 decimal places (e.g., JPY: 97.26)
IDR and VND: Whole numbers only (e.g., IDR: 10739, VND: 17338) as provided by RBA
Special Currencies
Trade-Weighted Index (TWI)
The TWI represents the value of the AUD against a basket of currencies weighted by trade volumes.
Included in latest rates
Not available for conversion operations
Used by economists and analysts for AUD strength analysis
Special Drawing Rights (SDR)
SDRs are international reserve assets created by the International Monetary Fund.
Basket currency including USD, EUR, CNY, JPY, GBP
Used for international accounting and reserves
Available for conversion operations
Rate Update Schedule
RBA Update Times
Daily : Monday to Friday (excludes Australian public holidays)
Time : 4:00 PM Australian Eastern Time (AEST/AEDT)
Source : Reserve Bank of Australia official rates
API Update Process
4:00 PM AEST : RBA publishes new rates
4:05-4:15 PM AEST : Our system fetches and validates data
4:15 PM AEST : New rates available via API
Fallback : If RBA is unavailable, previous day’s rates are served with stale data headers
Staleness Detection
When RBA data is unavailable, responses include:
X-Data-Stale : true
X-RBA-Source-Date : 2025-08-30
{
"success" : true ,
"timestamp" : 1725080400 ,
"base" : "AUD" ,
"date" : "2025-08-30" ,
"rates" : { ... }
}
Successful responses include useful metadata:
HTTP/2 200 OK
Content-Type : application/json
Cache-Control : no-store
X-Request-Id : 123e4567-e89b-12d3-a456-426614174000
X-RateLimit-Limit-Monthly : 5000
X-RateLimit-Remaining-Monthly : 4847
X-RateLimit-Reset : 2025-10-01T00:00:00Z
X-Response-Time : 45ms
Authenticated endpoints return Cache-Control: no-store to prevent caching of user-specific responses and ensure quota tracking accuracy.
Common Use Cases
1. Real-time Rate Display
async function updateRateDisplay () {
try {
const response = await fetch ( 'https://api.exchangeratesapi.com.au/latest' , {
headers: { 'Authorization' : 'Bearer your_api_key_here' }
});
const data = await response . json ();
if ( data . success ) {
// Update UI elements
document . getElementById ( 'usd-rate' ). textContent = data . rates . USD . toFixed ( 4 );
document . getElementById ( 'eur-rate' ). textContent = data . rates . EUR . toFixed ( 4 );
document . getElementById ( 'last-updated' ). textContent = new Date ( data . timestamp * 1000 ). toLocaleString ();
// Check for stale data
if ( data . stale ) {
document . getElementById ( 'stale-warning' ). style . display = 'block' ;
}
} else {
console . error ( 'Failed to fetch rates:' , data . error );
}
} catch ( error ) {
console . error ( 'Network error:' , error );
}
}
// Update rates every 30 minutes
setInterval ( updateRateDisplay , 30 * 60 * 1000 );
updateRateDisplay (); // Initial load
2. Bulk Currency Calculations
import requests
def calculate_portfolio_values ( aud_amounts , api_key ):
"""Convert AUD amounts to multiple currencies"""
headers = { 'Authorization' : f 'Bearer { api_key } ' }
response = requests.get( 'https://api.exchangeratesapi.com.au/latest' , headers = headers)
data = response.json()
if not data[ 'success' ]:
raise Exception ( f "API Error: { data[ 'error' ][ 'info' ] } " )
rates = data[ 'rates' ]
results = {}
for currency_code, aud_amount in aud_amounts.items():
if currency_code in rates:
converted_amount = aud_amount * rates[currency_code]
results[currency_code] = {
'aud_amount' : aud_amount,
'converted_amount' : round (converted_amount, 2 ),
'rate' : rates[currency_code],
'date' : data[ 'date' ]
}
return results
# Example usage
portfolio = {
'USD' : 10000 , # 10k AUD to convert to USD
'EUR' : 5000 , # 5k AUD to convert to EUR
'JPY' : 2000 # 2k AUD to convert to JPY
}
results = calculate_portfolio_values(portfolio, 'your_api_key_here' )
for currency, info in results.items():
print ( f " { info[ 'aud_amount' ] } AUD = { info[ 'converted_amount' ] } { currency } " )
3. Rate Comparison & Alerting
class RateMonitor {
constructor ( apiKey ) {
this . apiKey = apiKey ;
this . previousRates = {};
this . thresholds = {};
}
setThreshold ( currency , threshold ) {
this . thresholds [ currency ] = threshold ;
}
async checkRates () {
const response = await fetch ( 'https://api.exchangeratesapi.com.au/latest' , {
headers: { 'Authorization' : `Bearer ${ this . apiKey } ` }
});
const data = await response . json ();
if ( ! data . success ) {
console . error ( 'Rate check failed:' , data . error );
return ;
}
// Compare with previous rates
for ( const [ currency , currentRate ] of Object . entries ( data . rates )) {
const previousRate = this . previousRates [ currency ];
if ( previousRate ) {
const changePercent = (( currentRate - previousRate ) / previousRate ) * 100 ;
if ( Math . abs ( changePercent ) >= ( this . thresholds [ currency ] || 1 )) {
this . sendAlert ( currency , previousRate , currentRate , changePercent );
}
}
}
this . previousRates = { ... data . rates };
}
sendAlert ( currency , oldRate , newRate , changePercent ) {
const direction = changePercent > 0 ? 'increased' : 'decreased' ;
console . log ( `🚨 Alert: ${ currency } ${ direction } by ${ Math . abs ( changePercent ). toFixed ( 2 ) } %` );
console . log ( ` ${ oldRate } → ${ newRate } ` );
}
}
// Example usage
const monitor = new RateMonitor ( 'your_api_key_here' );
monitor . setThreshold ( 'USD' , 0.5 ); // Alert on 0.5% change
monitor . setThreshold ( 'EUR' , 0.5 );
// Check rates every 10 minutes during market hours
setInterval (() => monitor . checkRates (), 10 * 60 * 1000 );
<? php
class ExchangeRateCache {
private $apiKey ;
private $cacheFile = 'exchange_rates_cache.json' ;
private $cacheExpiry = 1800 ; // 30 minutes
public function __construct ( $apiKey ) {
$this -> apiKey = $apiKey ;
}
public function getLatestRates () {
// Check cache first
if ( $this -> isCacheValid ()) {
return json_decode ( file_get_contents ( $this -> cacheFile ), true );
}
// Fetch fresh data
$rates = $this -> fetchFromAPI ();
if ( $rates ) {
$this -> saveToCache ( $rates );
return $rates ;
}
// Fallback to cache if API fails
if ( file_exists ( $this -> cacheFile )) {
return json_decode ( file_get_contents ( $this -> cacheFile ), true );
}
throw new Exception ( 'Unable to fetch exchange rates' );
}
private function fetchFromAPI () {
$curl = curl_init ();
curl_setopt_array ( $curl , [
CURLOPT_URL => 'https://api.exchangeratesapi.com.au/latest' ,
CURLOPT_RETURNTRANSFER => true ,
CURLOPT_TIMEOUT => 10 ,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $this -> apiKey
],
]);
$response = curl_exec ( $curl );
$httpCode = curl_getinfo ( $curl , CURLINFO_HTTP_CODE );
curl_close ( $curl );
if ( $httpCode === 200 ) {
$data = json_decode ( $response , true );
return $data [ 'success' ] ? $data : null ;
}
return null ;
}
private function isCacheValid () {
if ( ! file_exists ( $this -> cacheFile )) {
return false ;
}
return ( time () - filemtime ( $this -> cacheFile )) < $this -> cacheExpiry ;
}
private function saveToCache ( $data ) {
file_put_contents ( $this -> cacheFile , json_encode ( $data ));
}
}
// Usage
$cache = new ExchangeRateCache ( 'your_api_key_here' );
$rates = $cache -> getLatestRates ();
echo "USD Rate: " . $rates [ 'rates' ][ 'USD' ] . " \n " ;
echo "Data from: " . $rates [ 'date' ] . " \n " ;
?>
Error Responses
{
"success" : false ,
"error" : {
"code" : 401 ,
"type" : "invalid_api_key" ,
"info" : "Invalid or missing API key."
}
}
{
"success" : false ,
"error" : {
"code" : 429 ,
"type" : "rate_limit_exceeded" ,
"info" : "Monthly quota of 5000 requests exceeded. Quota resets on your next billing cycle."
}
}
{
"success" : false ,
"error" : {
"code" : 503 ,
"type" : "service_unavailable" ,
"info" : "Exchange rates temporarily unavailable. Please try again later."
}
}
Next Steps
API key authentication using Bearer token
Comma-separated list of currency codes to filter results
Base currency (currently only AUD supported)
Unix timestamp of the rate date
Date of the rates (YYYY-MM-DD)
Object containing currency codes as keys and exchange rates as values