You need to programmatically fetch the EURIBOR 1-Month benchmark and use it inside a PHP application—for pricing floating-rate loans, computing spreads to treasury curves, or powering a risk dashboard. By the end of this guide you will be able to request the EURIBOR_1M rate from the Interest Rates API, read effective dates, stream historical time series, compute fluctuations and OHLC, compare costs against other benchmarks, and integrate those results in PHP with correct caching and error handling.
What EURIBOR_1M represents and why it matters
EURIBOR_1M is the 1-month tenor of the Euro Interbank Offered Rate. It reflects the average rate at which eurozone banks are willing to lend unsecured funds to one another for a one-month term. It’s widely used as a floating-rate index in euro-denominated loans, mortgages, and derivatives, and is a key input for risk, treasury, and analytics systems.
In the Interest Rates API, EURIBOR_1M is an interbank symbol with daily observations on business days. Values are returned as numeric interest rates (for example, 5.33). Treat the number as a percentage rate per annum unless your product requires another convention. Effective dates matter: downstream accruals and loan resets should align with the date associated with the returned rate.
All examples in this guide come from https://interestratesapi.com. You can start building right away—Get started with Interest Rates API and browse the Interest Rates API MCP reference.
API essentials
- Base URL: https://interestratesapi.com/api/v1/
- Authentication: append api_key=YOUR_API_KEY as a query parameter to every request.
- HTTP method: GET for all endpoints (no POST/PUT/DELETE).
- Primary symbol in this article: EURIBOR_1M.
The endpoints we’ll cover are: /symbols, /latest, /historical, /timeseries, /fluctuation, /ohlc, and /convert. All return JSON.
Latest EURIBOR_1M: getting the current 1-month fix
Use the latest endpoint to fetch the most recent available observation and its effective date. This is the foundation for dashboards and daily reset processes.
cURL (EURIBOR_1M)
curl -s "https://interestratesapi.com/api/v1/latest?api_key=YOUR_API_KEY&symbols=SOFR"
Official live sample (verbatim)
The following live sample block is provided as-is by the API documentation (it uses SOFR to illustrate the endpoint shape). Copying verbatim ensures you see the exact response fields your code should parse:
{
"success": true,
"date": "2026-10-01",
"base": "USD",
"rates": {
"SOFR": 3.87
},
"dates": {
"SOFR": "2026-10-01"
},
"currencies": {
"SOFR": "USD"
},
"base_filter_note": null
}
Example JSON (EURIBOR_1M)
Fields to note:
- rates: map of symbol to latest numeric rate.
- dates: map of symbol to the effective date for that rate.
- currencies: currency context for each symbol. Treat rates as percentage values; currency can be relevant if you mix cross-currency symbols.
PHP
<?php
$url = "https://interestratesapi.com/api/v1/latest?symbols=EURIBOR_1M,ECB_MRO&api_key=YOUR_API_KEY";
$json = file_get_contents($url);
$data = json_decode($json, true);
$euribor = $data['rates']['EURIBOR_1M'] ?? null;
$euriborDate = $data['dates']['EURIBOR_1M'] ?? null;
if ($euribor !== null) {
// Example: compute a daily accrual factor for a 30/360 convention
$annualRate = $euribor / 100.0;
$dailyFactor = $annualRate / 360.0;
// Use $dailyFactor * principal for one day's simple interest at this rate
}
echo "EURIBOR_1M: {$euribor} (effective {$euriborDate})\n";
?>
Python (requests)
import requests
response = requests.get(
'https://interestratesapi.com/api/v1/latest',
params=dict(symbols='EURIBOR_1M,ECB_MRO', api_key='YOUR_API_KEY')
)
data = response.json()
euribor = data['rates'].get('EURIBOR_1M')
date = data['dates'].get('EURIBOR_1M')
print('EURIBOR_1M:', euribor, 'effective', date)
JavaScript (fetch)
const resp = await fetch('https://interestratesapi.com/api/v1/latest?symbols=EURIBOR_1M,ECB_MRO&api_key=YOUR_API_KEY');
const data = await resp.json();
console.log('EURIBOR_1M', data.rates?.EURIBOR_1M, 'effective', data.dates?.EURIBOR_1M);
Discover symbols: filtering to interbank EUR rates
Use the symbols catalogue to programmatically discover available rates and their metadata (category, frequency, currency context). This is helpful for building symbol pickers or validation layers.
cURL
PHP
<?php
$url = "https://interestratesapi.com/api/v1/symbols?category=interbank&base=EUR&api_key=YOUR_API_KEY";
$data = json_decode(file_get_contents($url), true);
foreach ($data['symbols'] ?? [] as $sym) {
if ($sym['symbol'] === 'EURIBOR_1M') {
echo $sym['symbol'], ' - ', $sym['name'], ' (', $sym['frequency'], ")\n";
}
}
?>
Python
import requests
r = requests.get('https://interestratesapi.com/api/v1/symbols',
params={'category': 'interbank', 'base': 'EUR', 'api_key': 'YOUR_API_KEY'})
print(r.json())
JavaScript
const r = await fetch('https://interestratesapi.com/api/v1/symbols?category=interbank&base=EUR&api_key=YOUR_API_KEY');
console.log(await r.json());
Historical: value on a specific date
For backtesting and month-end valuations, request the rate as of a specific date. For monthly symbols, the API returns the last observation available within that month. EURIBOR_1M is daily, so the requested date is aligned to the closest available business day in the dataset.
cURL
JSON
PHP
<?php
$params = http_build_query([
'date' => '2025-06-15',
'symbols' => 'EURIBOR_1M',
'api_key' => 'YOUR_API_KEY'
]);
$data = json_decode(file_get_contents("https://interestratesapi.com/api/v1/historical?$params"), true);
echo json_encode($data['rates'], JSON_PRETTY_PRINT), PHP_EOL;
?>
Python
import requests
res = requests.get('https://interestratesapi.com/api/v1/historical',
params={'date': '2025-06-15', 'symbols': 'EURIBOR_1M', 'api_key': 'YOUR_API_KEY'})
print(res.json())
JavaScript
const r = await fetch('https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=EURIBOR_1M&api_key=YOUR_API_KEY');
console.log(await r.json());
Time series: daily EURIBOR_1M between two dates
For charts, regressions, and volatility analysis, retrieve a contiguous series. Use start and end dates and specify the EURIBOR_1M symbol.
cURL
JSON
Key fields:
- rates.EURIBOR_1M: map of ISO date to numeric rate.
- frequencies: per-symbol frequency (EURIBOR_1M is daily).
- currencies: per-symbol currency context.
PHP
<?php
$params = http_build_query([
'start' => '2025-10-04',
'end' => '2026-10-04',
'symbols' => 'EURIBOR_1M',
'api_key' => 'YOUR_API_KEY'
]);
$data = json_decode(file_get_contents("https://interestratesapi.com/api/v1/timeseries?$params"), true);
$series = $data['rates']['EURIBOR_1M'] ?? [];
foreach ($series as $d => $v) {
// Example: stream to a chart or compute a rolling avg
}
echo "Points: " . count($series) . PHP_EOL;
?>
Python
import requests
r = requests.get('https://interestratesapi.com/api/v1/timeseries',
params={'start': '2025-10-04', 'end': '2026-10-04', 'symbols': 'EURIBOR_1M', 'api_key': 'YOUR_API_KEY'})
print(r.json())
JavaScript
const url = 'https://interestratesapi.com/api/v1/timeseries?start=2025-10-04&end=2026-10-04&symbols=EURIBOR_1M&api_key=YOUR_API_KEY';
const data = await (await fetch(url)).json();
console.log(Object.keys(data.rates?.EURIBOR_1M || {}).length, 'points');
Fluctuation: changes, highs, and lows across a window
To quickly measure how EURIBOR_1M moved over a period, use fluctuation. The response includes start and end values, absolute and percent change, and intra-period high/low.
cURL
JSON
Use change_pct for normalized comparisons across tenors, and high/low to annotate charts. For example, a risk widget can highlight when the rate exits a tolerance band.
PHP
<?php
$q = http_build_query([
'start' => '2025-10-04', 'end' => '2026-10-04', 'symbols' => 'EURIBOR_1M', 'api_key' => 'YOUR_API_KEY'
]);
$data = json_decode(file_get_contents("https://interestratesapi.com/api/v1/fluctuation?$q"), true);
$f = $data['rates']['EURIBOR_1M'] ?? [];
echo "Δ: {$f['change']} (", $f['change_pct'], "%), High: {$f['high']}, Low: {$f['low']}\n";
?>
Python
import requests
r = requests.get('https://interestratesapi.com/api/v1/fluctuation',
params={'start': '2025-10-04', 'end': '2026-10-04', 'symbols': 'EURIBOR_1M', 'api_key': 'YOUR_API_KEY'})
print(r.json())
JavaScript
const r = await fetch('https://interestratesapi.com/api/v1/fluctuation?start=2025-10-04&end=2026-10-04&symbols=EURIBOR_1M&api_key=YOUR_API_KEY');
console.log(await r.json());
OHLC: candlestick-style aggregations
For charting, roll daily EURIBOR_1M data into weekly, monthly, or quarterly OHLC. The API computes OHLC on the fly from daily observations, so you don’t manage separate aggregation logic.
cURL
JSON
data_points shows how many daily observations fed the aggregation window. Use period to label your candlesticks. For trend detection, compare close-to-close or high-low ranges.
PHP
<?php
$params = http_build_query([
'symbols' => 'EURIBOR_1M',
'period' => 'monthly',
'start' => '2025-10-04',
'end' => '2026-10-04',
'api_key' => 'YOUR_API_KEY'
]);
$data = json_decode(file_get_contents("https://interestratesapi.com/api/v1/ohlc?$params"), true);
$bars = $data['rates']['EURIBOR_1M'] ?? [];
foreach ($bars as $bar) {
// $bar['period'], $bar['open'], $bar['high'], $bar['low'], $bar['close'], $bar['data_points']
}
?>
Python
import requests
r = requests.get('https://interestratesapi.com/api/v1/ohlc',
params={'symbols': 'EURIBOR_1M', 'period': 'monthly',
'start': '2025-10-04', 'end': '2026-10-04', 'api_key': 'YOUR_API_KEY'})
print(r.json())
JavaScript
const url = 'https://interestratesapi.com/api/v1/ohlc?symbols=EURIBOR_1M&period=monthly&start=2025-10-04&end=2026-10-04&api_key=YOUR_API_KEY';
console.log(await (await fetch(url)).json());
Convert: compare loan interest cost vs another benchmark
Use convert to compute a simple interest cost comparison between two benchmarks at their latest values. This is useful for quoting, repricing, and saving estimators. You can also derive the rate spread directly from the response.
cURL
JSON
Practical usage:
- rate_spread is simply from.rate - to.rate.
- To compute a monthly payment for an amortizing loan at EURIBOR_1M + margin, apply your amortization formula using the annual rate converted to a periodic rate (e.g., monthly_rate = (euribor + margin)/100/12). Do not hardcode numbers—read the rate dynamically.
PHP
<?php
$q = http_build_query([
'from' => 'EURIBOR_1M', 'to' => 'ECB_MRO',
'amount' => 100000, 'term_months' => 12,
'api_key' => 'YOUR_API_KEY'
]);
$data = json_decode(file_get_contents("https://interestratesapi.com/api/v1/convert?$q"), true);
$spread = $data['difference']['rate_spread'] ?? null;
echo "Spread (bps): " . ($spread * 100) . "\n"; // spread in percentage points * 100 = basis points
?>
Python
import requests
r = requests.get('https://interestratesapi.com/api/v1/convert',
params={'from': 'EURIBOR_1M', 'to': 'ECB_MRO',
'amount': 100000, 'term_months': 12, 'api_key': 'YOUR_API_KEY'})
print(r.json())
JavaScript
const u = 'https://interestratesapi.com/api/v1/convert?from=EURIBOR_1M&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY';
console.log(await (await fetch(u)).json());
Production details: frequency, business days, caching, and errors
Publication frequency: EURIBOR_1M is provided as a daily series on business days. There is no data on weekends or certain holidays. If you ask for a date with no observation, align to the nearest available business day in your UI, or fall back to the most recent prior date depending on your policy.
Effective dates: Always read dates.EURIBOR_1M (from /latest) or the keys in timeseries.rates.EURIBOR_1M. Use those as accrual effective dates. The API time stamps are ISO dates; there is no time-of-day component exposed here.
Caching: Cache /latest responses for the trading day to stabilize UX and respect rate limits. For /timeseries, cache by (start, end, symbols) tuple. Invalidation: new fixes will roll in on the next business day; purge daily if you snapshot rates overnight.
Rate limits and headers: On 429 responses, read the Retry-After header and X-RateLimit-* headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) to schedule retries or back off. Gracefully degrade your UI by using cached data while backing off.
Error handling: The API returns a consistent error shape with success=false and an error message, plus sometimes a details field on 404. Common HTTP codes:
- 401: Missing/invalid api_key.
- 403: Account not active.
- 404: No symbols matched or no data for the requested range.
- 422: Validation error (e.g., date format).
- 429: Quota exhausted (respect Retry-After).
Computing spreads and payments without hardcoding numbers
Spread to another benchmark: Retrieve both rates using /latest (e.g., EURIBOR_1M and ECB_MRO). Compute spread = rate_a - rate_b. For basis points: bps = spread * 100. Persist the dates map to ensure spreads compare like with like on the same effective date.
Floating monthly payment: For an amortizing loan with principal P, annual rate R (percentage), and tenor n months, compute monthly_rate = (R/100)/12. The standard annuity payment is Payment = P * monthly_rate / (1 - (1 + monthly_rate)^(-n)). If you must apply a margin m over EURIBOR_1M, use R = EURIBOR_1M + m. Always pull EURIBOR_1M from the API at runtime; do not hardcode constants.
Use cases that ship
- Interest rate dashboard: Display EURIBOR_1M latest, its daily/weekly change from /fluctuation, and a 1-year chart from /timeseries.
- Loan repricing: Compare total interest under EURIBOR_1M vs central bank rates using /convert; expose the rate_spread and interest_saved fields.
- Macro research: Roll daily data into monthly OHLC to analyze volatility regimes and inflection points.
- Risk models: Backtest sensitivity to EURIBOR_1M shocks using historical curves from /timeseries and scenario deltas from /fluctuation.
Explore more at interestratesapi.com and the MCP. When you’re ready to build, Register to get your API key.
Complete endpoint index with PHP, Python, and JS snippets
/api/v1/symbols
<?php echo file_get_contents("https://interestratesapi.com/api/v1/symbols?category=interbank&base=EUR&api_key=YOUR_API_KEY"); ?>
import requests; print(requests.get('https://interestratesapi.com/api/v1/symbols', params={'category':'interbank','base':'EUR','api_key':'YOUR_API_KEY'}).json())
console.log(await (await fetch('https://interestratesapi.com/api/v1/symbols?category=interbank&base=EUR&api_key=YOUR_API_KEY')).json());
/api/v1/latest
<?php echo file_get_contents("https://interestratesapi.com/api/v1/latest?symbols=EURIBOR_1M&api_key=YOUR_API_KEY"); ?>
import requests; print(requests.get('https://interestratesapi.com/api/v1/latest', params={'symbols':'EURIBOR_1M','api_key':'YOUR_API_KEY'}).json())
console.log(await (await fetch('https://interestratesapi.com/api/v1/latest?symbols=EURIBOR_1M&api_key=YOUR_API_KEY')).json());
/api/v1/historical
<?php echo file_get_contents("https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=EURIBOR_1M&api_key=YOUR_API_KEY"); ?>
import requests; print(requests.get('https://interestratesapi.com/api/v1/historical', params={'date':'2025-06-15','symbols':'EURIBOR_1M','api_key':'YOUR_API_KEY'}).json())
console.log(await (await fetch('https://interestratesapi.com/api/v1/historical?date=2025-06-15&symbols=EURIBOR_1M&api_key=YOUR_API_KEY')).json());
/api/v1/timeseries
<?php echo file_get_contents("https://interestratesapi.com/api/v1/timeseries?start=2025-10-04&end=2026-10-04&symbols=EURIBOR_1M&api_key=YOUR_API_KEY"); ?>
import requests; print(requests.get('https://interestratesapi.com/api/v1/timeseries', params={'start':'2025-10-04','end':'2026-10-04','symbols':'EURIBOR_1M','api_key':'YOUR_API_KEY'}).json())
console.log(await (await fetch('https://interestratesapi.com/api/v1/timeseries?start=2025-10-04&end=2026-10-04&symbols=EURIBOR_1M&api_key=YOUR_API_KEY')).json());
/api/v1/fluctuation
<?php echo file_get_contents("https://interestratesapi.com/api/v1/fluctuation?start=2025-10-04&end=2026-10-04&symbols=EURIBOR_1M&api_key=YOUR_API_KEY"); ?>
import requests; print(requests.get('https://interestratesapi.com/api/v1/fluctuation', params={'start':'2025-10-04','end':'2026-10-04','symbols':'EURIBOR_1M','api_key':'YOUR_API_KEY'}).json())
console.log(await (await fetch('https://interestratesapi.com/api/v1/fluctuation?start=2025-10-04&end=2026-10-04&symbols=EURIBOR_1M&api_key=YOUR_API_KEY')).json());
/api/v1/ohlc
<?php echo file_get_contents("https://interestratesapi.com/api/v1/ohlc?symbols=EURIBOR_1M&(period)=monthly&start=2025-10-04&end=2026-10-04&api_key=YOUR_API_KEY"); ?>
import requests; print(requests.get('https://interestratesapi.com/api/v1/ohlc', params={'symbols':'EURIBOR_1M','period':'monthly','start':'2025-10-04','end':'2026-10-04','api_key':'YOUR_API_KEY'}).json())
console.log(await (await fetch('https://interestratesapi.com/api/v1/ohlc?symbols=EURIBOR_1M&period=monthly&start=2025-10-04&end=2026-10-04&api_key=YOUR_API_KEY')).json());
/api/v1/convert
<?php echo file_get_contents("https://interestratesapi.com/api/v1/convert?from=EURIBOR_1M&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY"); ?>
import requests; print(requests.get('https://interestratesapi.com/api/v1/convert', params={'from':'EURIBOR_1M','to':'ECB_MRO','amount':100000,'term_months':12,'api_key':'YOUR_API_KEY'}).json())
console.log(await (await fetch('https://interestratesapi.com/api/v1/convert?from=EURIBOR_1M&to=ECB_MRO&amount=100000&term_months=12&api_key=YOUR_API_KEY')).json());
Practical notes for PHP implementers
- Always append the api_key query parameter; do not use headers for auth.
- Normalize decimals: cast to float and convert percentage to fractions only where formulas require (divide by 100 once, in one place).
- Guard nulls: not all symbols appear in every response unless explicitly requested; always check isset() before math.
- Timezone: responses use ISO dates; align your accrual engine to your business calendar rather than assuming weekends/holidays have data.
- Retries: on 429, apply exponential backoff and honor Retry-After. Consider using cached last-good responses.
FAQ
How is EURIBOR_1M returned—percent or decimal?
As a numeric rate value you should interpret as a percent per annum. Convert to a decimal fraction for formulas by dividing by 100.
What date should I use for accruals or resets?
Use the effective date provided in dates.EURIBOR_1M (from /latest) or the date keys in /timeseries. Align your loan reset logic to those dates.
Why am I seeing no data on weekends?
EURIBOR_1M is a business-day series. Use the most recent business day’s observation or adjust your UI to display “no new fix” on weekends and holidays.
How do I compute a spread vs another index?
Fetch both rates in one /latest call and subtract: spread = EURIBOR_1M - other_rate. For basis points, multiply the percentage-point spread by 100.
Can I chart monthly candles without building rollups?
Yes. Use /ohlc with period=monthly (or weekly/quarterly). The API returns open, high, low, close and data_points for each period from the underlying daily series.
Build your EURIBOR_1M integration now. Register for your API key, explore the MCP, and check interestratesapi.com for more endpoints. Also see: Register for Interest Rates API and Get started with Interest Rates API.




