Germany Bond Yields: Intraday and Fluctuation via API

Germany Bond Yields: Intraday and Fluctuation via API

You need reliable, intraday-accessible Germany sovereign bond yields inside your own tools. By the end of this guide, you’ll be able to query German Bund yields across maturities, pull intraday snapshots, compute fluctuations and spreads, and assemble a full DE yield curve from the Bonds API—then integrate it into dashboards, portfolio analytics, and research pipelines.

What the data represents and how to read it

Bonds API delivers sovereign bond yields for Germany (DE) across standard tenors (for example, 1M through 30Y). Unless otherwise noted, yields are expressed in percent (for example, 4.52 means 4.52%). Spreads are provided in basis points (bps), where 1 bp equals 0.01 percentage points. Dates are calendar dates formatted as Y-m-d (for example, 2026-10-05). Timestamps, when present (for example, intraday snapshots), are provided in UTC (for example, 2026-10-05T12:00:00Z).

Illustration: Germany Bond Yields: Intraday and Fluctuation via API

Market coverage focuses on business days. Historical and timeseries endpoints return values only on days with available data (for example, excluding weekends and market holidays). Intraday snapshots collect during market hours, and snapshots include a UTC timestamp. For production systems, apply light caching at the application layer (for example, 15–60 seconds for latest, 1–5 minutes for curve) to avoid hitting rate limits during refresh spikes while keeping monitoring panels responsive.

All endpoints below are GET over HTTPS at https://bonds-api.com/api/v1/ and authenticate with an API key via the X-API-Key header. Explore the platform at bonds-api.com or via the MCP. When you are ready to run, Register for an API key.

Endpoint: Latest Germany yields (current values)

Use this to power real-time tiles on a dashboard or to seed analytics that need the latest close/indicative.

cURL

curl -s "https://bonds-api.com/api/v1/latest?countries=US&maturities=10Y&api_key=YOUR_API_KEY"

JSON response

{
"success": true,
"date": "2026-10-05",
"rates": {
"US_10Y": 5.256
},
"dates": {
"US_10Y": "2026-10-05"
},
"currencies": {
"US_10Y": "USD"
},
"meta": {
"request_id": "9be92b29-29d4-40c9-aa9b-b6ac38ce86ef",
"timestamp": "2026-10-05T00:04:04+00:00"
}
}

How to read this:

  • data.DE.2Y.yield and data.DE.10Y.yield: the 2Y and 10Y German Bund yields (percentage points).
  • date: the valuation date (Y-m-d) for each maturity.
  • source: origin label; “official” indicates official-source data.

Python (requests)

import requests

resp = requests.get(
"https://bonds-api.com/api/v1/latest",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"countries": "DE", "maturities": "2Y,10Y"}
)
resp.raise_for_status()
data = resp.json()

de_2y = data["data"]["DE"]["2Y"]["yield"]
de_10y = data["data"]["DE"]["10Y"]["yield"]
as_of = data["data"]["DE"]["10Y"]["date"]
print(f"DE 2Y={de_2y}% 10Y={de_10y}% as of {as_of}")

JavaScript (fetch)

const url = new URL("https://bonds-api.com/api/v1/latest");
url.searchParams.set("countries", "DE");
url.searchParams.set("maturities", "2Y,10Y");

fetch(url.toString(), {
method: "GET",
headers: { "X-API-Key": "YOUR_API_KEY" }
})
.then(r => r.json())
.then(json => {
const twoY = json.data.DE["2Y"].yield;
const tenY = json.data.DE["10Y"].yield;
console.log(`DE 2Y=${twoY}%, 10Y=${tenY}%`);
});

PHP (file_get_contents)

<?php
$context = stream_context_create([
"http" => [
"method" => "GET",
"header" => "X-API-Key: YOUR_API_KEY\r\n"
]
]);
$url = "https://bonds-api.com/api/v1/latest?countries=DE&maturities=2Y,10Y";
$json = file_get_contents($url, false, $context);
$data = json_decode($json, true);
echo "DE 10Y=" . $data["data"]["DE"]["10Y"]["yield"] . "%\n";

Endpoint: Historical yield on a specific date

Fetch a point-in-time yield for backtesting, valuation date alignment, or event studies.

cURL

JSON response

Fields:

  • yield: 10Y Bund yield on the requested date (percent).
  • country, maturity, date: echo the request.

Python

import requests

params = {"country": "DE", "maturity": "10Y", "date": "2025-06-15"}
r = requests.get(
"https://bonds-api.com/api/v1/historical",
headers={"X-API-Key": "YOUR_API_KEY"},
params=params
)
r.raise_for_status()
print(r.json())

JavaScript

const params = new URLSearchParams({
country: "DE",
maturity: "10Y",
date: "2025-06-15"
});
fetch(`https://bonds-api.com/api/v1/historical?${params}`, {
headers: { "X-API-Key": "YOUR_API_KEY" }
})
.then(r => r.json())
.then(console.log);

PHP

<?php
$params = http_build_query([
"country" => "DE",
"maturity" => "10Y",
"date" => "2025-06-15"
]);
$opts = ["http" => ["method" => "GET", "header" => "X-API-Key: YOUR_API_KEY\r\n"]];
$ctx = stream_context_create($opts);
echo file_get_contents("https://bonds-api.com/api/v1/historical?$params", false, $ctx);

Endpoint: Time series for Germany by maturity

Get business-day series for a given maturity to power charts, regressions, and risk models.

cURL

JSON response

Fields:

  • series: an array of daily observations, business days only, each with date (Y-m-d) and yield (%).

Python

import requests
import pandas as pd

params = {"country": "DE", "maturity": "10Y", "start": "2025-10-05", "end": "2026-10-05"}
r = requests.get("https://bonds-api.com/api/v1/timeseries",
headers={"X-API-Key": "YOUR_API_KEY"},
params=params)
r.raise_for_status()
js = r.json()
df = pd.DataFrame(js["series"]).set_index("date").astype(float)
print(df.head())

JavaScript

const u = new URL("https://bonds-api.com/api/v1/timeseries");
u.search = new URLSearchParams({
country: "DE",
maturity: "10Y",
start: "2025-10-05",
end: "2026-10-05"
}).toString();

fetch(u, { headers: { "X-API-Key": "YOUR_API_KEY" }})
.then(r => r.json())
.then(({ series }) => {
const dates = series.map(p => p.date);
const yields = series.map(p => p.yield);
console.log(dates[0], yields[0]);
});

PHP

<?php
$q = http_build_query([
"country" => "DE",
"maturity" => "10Y",
"start" => "2025-10-05",
"end" => "2026-10-05"
]);
$ctx = stream_context_create(["http" => ["method" => "GET", "header" => "X-API-Key: YOUR_API_KEY\r\n"]]);
$data = file_get_contents("https://bonds-api.com/api/v1/timeseries?$q", false, $ctx);
echo $data;

Endpoint: Spread versus benchmark (Germany vs another country)

Compute the 10Y Bund vs benchmark spread in basis points, plus both legs’ yields. This is useful for cross-market relative value and macro dashboards.

cURL

JSON response

Fields:

  • spread_bps: DE minus US for the selected maturity (basis points).
  • country_yield, benchmark_yield: each leg’s yield in percent.

Python

import requests

params = {"country": "DE", "benchmark": "US", "maturity": "10Y"}
r = requests.get("https://bonds-api.com/api/v1/spread",
headers={"X-API-Key": "YOUR_API_KEY"},
params=params)
r.raise_for_status()
spread = r.json()["spread_bps"]
print(f"DE vs US 10Y spread: {spread} bps")

JavaScript

const qs = new URLSearchParams({ country: "DE", benchmark: "US", maturity: "10Y" });
fetch(`https://bonds-api.com/api/v1/spread?${qs}`, {
headers: { "X-API-Key": "YOUR_API_KEY" }
})
.then(r => r.json())
.then(d => console.log(`Spread: ${d.spread_bps} bps`));

PHP

<?php
$qs = http_build_query(["country" => "DE", "benchmark" => "US", "maturity" => "10Y"]);
$ctx = stream_context_create(["http" => ["method" => "GET", "header" => "X-API-Key: YOUR_API_KEY\r\n"]]);
echo file_get_contents("https://bonds-api.com/api/v1/spread?$qs", false, $ctx);

Endpoint: Full Germany yield curve

Pull the full Bund curve to construct term-structure analytics, bootstraps, or forward curves. The response indicates if the curve is inverted.

cURL

JSON response

Fields:

  • curve: a map of maturity tenors to yields in percent.
  • inverted: true if the curve indicates inversion (for example, short rates greater than long rates).
  • date: date for which the curve is valid.
MaturityYield (%)
1M5.31
3M5.27
6M5.18
1Y4.98
2Y4.25
5Y4.39
10Y4.52
30Y4.71

Python

import requests

r = requests.get("https://bonds-api.com/api/v1/curve",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"country": "DE"})
curve = r.json()["curve"]
tenors = ["1M","3M","6M","1Y","2Y","5Y","10Y","30Y"]
print([ (t, curve[t]) for t in tenors ])

JavaScript

const urlCurve = new URL("https://bonds-api.com/api/v1/curve");
urlCurve.searchParams.set("country", "DE");

fetch(urlCurve, { headers: { "X-API-Key": "YOUR_API_KEY" }})
.then(r => r.json())
.then(({ inverted, curve }) => {
console.log("Inverted:", inverted);
console.log("10Y:", curve["10Y"]);
});

PHP

<?php
$ctx = stream_context_create(["http" => ["method" => "GET", "header" => "X-API-Key: YOUR_API_KEY\r\n"]]);
echo file_get_contents("https://bonds-api.com/api/v1/curve?country=DE", false, $ctx);

Endpoint: Intraday snapshots for Germany

For minute-level or hour-level monitoring, fetch the intraday snapshots with UTC timestamps. Use this to build session charts or to track moves around ECB headlines.

cURL

JSON response

Fields:

  • snapshots: intraday array, each with yield (%) and fetched_at in UTC.
  • count: number of snapshots returned.
  • meta.timezone: timezone for timestamps (UTC).

Python

import requests

params = {"country": "DE", "maturity": "10Y", "date": "2026-10-05"}
r = requests.get("https://bonds-api.com/api/v1/intraday",
headers={"X-API-Key": "YOUR_API_KEY"},
params=params)
r.raise_for_status()
snaps = r.json()["snapshots"]
for s in snaps:
print(s["fetched_at"], s["yield"])

JavaScript

const intradayParams = new URLSearchParams({
country: "DE",
maturity: "10Y",
date: "2026-10-05"
});
fetch(`https://bonds-api.com/api/v1/intraday?${intradayParams}`, {
headers: { "X-API-Key": "YOUR_API_KEY" }
})
.then(r => r.json())
.then(({ snapshots }) => {
for (const s of snapshots) console.log(s.fetched_at, s.yield);
});

PHP

<?php
$qs = http_build_query(["country" => "DE", "maturity" => "10Y", "date" => "2026-10-05"]);
$ctx = stream_context_create(["http" => ["method" => "GET", "header" => "X-API-Key: YOUR_API_KEY\r\n"]]);
echo file_get_contents("https://bonds-api.com/api/v1/intraday?$qs", false, $ctx);

Endpoint: Fluctuation (change, min, max) over a window

Summarize a move window for a given maturity—ideal for performance summaries and alerting thresholds.

cURL

JSON response

Fields:

  • start_yield, end_yield: window endpoints (percent).
  • change: absolute change in percentage points (for example, 0.31 equals +31 bps).
  • min, max: extrema in the window (percent).

Python

import requests

params = {
"countries": "DE",
"maturity": "10Y",
"start": "2025-10-05",
"end": "2026-10-05"
}
r = requests.get("https://bonds-api.com/api/v1/fluctuation",
headers={"X-API-Key": "YOUR_API_KEY"},
params=params)
r.raise_for_status()
print(r.json()["data"]["DE"])

JavaScript

const p = new URLSearchParams({
countries: "DE",
maturity: "10Y",
start: "2025-10-05",
end: "2026-10-05"
});
fetch(`https://bonds-api.com/api/v1/fluctuation?${p}`, {
headers: { "X-API-Key": "YOUR_API_KEY" }
})
.then(r => r.json())
.then(d => console.log(d.data.DE));

PHP

<?php
$params = http_build_query([
"countries" => "DE",
"maturity" => "10Y",
"start" => "2025-10-05",
"end" => "2026-10-05"
]);
$ctx = stream_context_create(["http" => ["method" => "GET", "header" => "X-API-Key: YOUR_API_KEY\r\n"]]);
echo file_get_contents("https://bonds-api.com/api/v1/fluctuation?$params", false, $ctx);

Error handling and operational notes

Common error responses keep a uniform shape with success=false and an error string. Typical HTTP status codes include:

  • 401: Missing or invalid X-API-Key
  • 403: Account quota exceeded
  • 404: No data for requested country/maturity/date
  • 422: Invalid parameter (for example, date format must be Y-m-d, ISO2 country codes)
  • 429: Rate limit exceeded
  • 500: Server error

Implement retries with jitter for 429/500, and validate parameter formats client-side to avoid 422. Cache stable endpoints (curve, timeseries) to reduce load and improve response times in multi-user dashboards.

Building a Germany yield curve and spreads in your app

To build a daily Bund curve, call the curve endpoint once per refresh cycle and fan out maturities into your chart. If you want to compute a par or zero curve, use the provided points as inputs to your chosen interpolation or bootstrap method.

For spreads, combine the spread endpoint for Germany versus your chosen benchmark at the 10Y point, or compute multi-horizon spreads by calling the latest endpoint for multiple maturities and subtracting series across countries where needed. When the endpoint supports multiple symbols (for example, latest with multiple maturities), issue a single call for efficiency and align on the same as-of date.

Use cases

  • Financial dashboards: live tiles for DE 2Y/5Y/10Y, intraday session chart from /intraday, and daily change from /fluctuation.
  • Portfolio risk tools: stress tests on 10Y Bund shocks using timeseries windows; cross-market spread monitors with /spread.
  • Economic research: term-structure dynamics with /curve and daily panels from /timeseries for regressions and macro studies.

Explore the platform and documentation at bonds-api.com, or browse schemas via the MCP.

Official sample: alternate latest format

The following official sample shows an alternate latest response format using a query parameter for api_key. Use it as-is for testing the structure below, and use the X-API-Key header everywhere else as demonstrated above.

How to read this:

  • rates.US_10Y: yield in percent for the US 10Y on the given date.
  • dates: per-symbol as-of date.
  • currencies: reporting currency for each symbol (for example, USD).
  • meta.timestamp: UTC timestamp for the server’s fulfillment.

Practical integration checklist

  • Authentication: send X-API-Key: YOUR_API_KEY in the header.
  • Parameters: use ISO2 country codes (DE), maturities like 2Y, 10Y.
  • Units: yields in percent; spreads in basis points.
  • Timestamps: intraday snapshots in UTC; daily series use Y-m-d dates.
  • Business days: if a date is a weekend/holiday, historical endpoints will return the nearest date with data only if explicitly available; otherwise expect 404 for unavailable combinations.
  • Caching: cache per endpoint purpose—seconds for latest, minutes for curve/timeseries.
  • Error handling: parse JSON with success=false and inspect error for remediation; backoff on 429.

FAQ

What timezone are intraday timestamps in?
All intraday fetched_at timestamps are in UTC, as indicated by the trailing Z and meta.timezone in the response.

How are yields and spreads expressed?
Yields are percentages (for example, 4.52 represents 4.52%). Spreads are in basis points (for example, 25 means 0.25%).

Can I request multiple maturities at once?
Yes, use /latest with maturities=2Y,5Y,10Y to reduce calls and build a partial curve efficiently. Use /curve to get the full term structure for a given date.

How should I handle non-trading days?
Query historical and timeseries endpoints with business-day ranges. If you must display calendar-continuous charts, forward-fill or gap markers on weekends and holidays at the application layer.

What’s a good refresh cadence?
For monitoring, poll /latest every 15–60 seconds and /intraday at similar cadence during market hours. Cache /curve and /timeseries for 1–5 minutes depending on UI needs.

Ship your Germany yield integrations with minimal friction. Browse the API in the MCP, then Register to get your API key and start calling endpoints from your code.

Start building with bond data today

Get your API key and access sovereign bond yields across 60+ countries. 7-day free trial, no credit card required.

Related posts

All posts →