Singapore Bond Yields: Intraday and Fluctuation via API

Singapore Bond Yields: Intraday and Fluctuation via API

You need reliable, machine-readable Singapore government bond yields with intraday snapshots and period fluctuations that plug directly into your quant models and dashboards. By the end of this article, you’ll be able to fetch Singapore (SG) yields across maturities, build a yield curve, compare spreads, analyze intraday movements, and quantify changes over time using Bonds API’s REST endpoints.

What this data covers and how to read it

Bonds API provides sovereign bond yields for 60+ countries, including Singapore, across standard maturities from 1M bills to 30Y bonds (some countries extend to 50Y). Yields are expressed as percentages (e.g., 4.52 means 4.52% per annum). For spread endpoints, differences are expressed in basis points (bps), where 1 bp = 0.01%.

Illustration: Singapore Bond Yields: Intraday and Fluctuation via API

Dates are ISO-8601 calendar dates in the format YYYY-MM-DD (e.g., 2026-10-03). Intraday timestamps use ISO-8601 with an explicit timezone (UTC in the examples). All endpoints are HTTP GET and require the X-API-Key header. Base URL: https://bonds-api.com/api/v1/

Key modeling notes for Singapore:

  • Trading and official publication align with Singapore business days; you may see gaps on weekends and Singapore public holidays.
  • Latest yields typically reflect the most recently available official or market snapshot for that maturity.
  • Intraday snapshots are point-in-time yields fetched at specific UTC times; you’ll likely want to resample or aggregate when charting.

Explore the broader product at https://bonds-api.com and register to obtain an API key: Register. For schema exploration and tools, see MCP.

Endpoint: Latest (current yields)

Fetch current yields for Singapore across selected maturities. Use cases: dashboards, live monitors, and daily reports.

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-02",
"rates": {
"US_10Y": 5.28
},
"dates": {
"US_10Y": "2026-10-02"
},
"currencies": {
"US_10Y": "USD"
},
"meta": {
"request_id": "a12d4984-5212-40c0-812d-d10ba512bd61",
"timestamp": "2026-10-03T00:04:05+00:00"
}
}

Interpretation:

  • yield: percentage (e.g., 4.52 = 4.52% per annum)
  • date: latest calendar date for which that maturity has data
  • source: “official” indicates an official publication source for the reference day

Python (requests)

import requests

resp = requests.get(
"https://bonds-api.com/api/v1/latest",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"countries": "SG", "maturities": "2Y,10Y"}
)
data = resp.json()
sg_2y = data["data"]["SG"]["2Y"]["yield"]
sg_10y = data["data"]["SG"]["10Y"]["yield"]
print("SG 2Y:", sg_2y, "SG 10Y:", sg_10y)

JavaScript (fetch)

const url = new URL("https://bonds-api.com/api/v1/latest");
url.search = new URLSearchParams({ countries: "SG", maturities: "2Y,10Y" }).toString();

fetch(url, { headers: { "X-API-Key": "YOUR_API_KEY" } })
.then(r => r.json())
.then(d => {
const twoY = d.data.SG["2Y"].yield;
const tenY = d.data.SG["10Y"].yield;
console.log("SG 2Y:", twoY, "SG 10Y:", tenY);
});

PHP (file_get_contents)

<?php
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "X-API-Key: YOUR_API_KEY\r\n"
]
]);

$query = http_build_query([
'countries' => 'SG',
'maturities' => '2Y,10Y'
]);

$response = file_get_contents("https://bonds-api.com/api/v1/latest?$query", false, $context);
$data = json_decode($response, true);
echo "SG 10Y: " . $data['data']['SG']['10Y']['yield'] . PHP_EOL;

Official live sample block (as provided)

The following official sample block is provided as-is and demonstrates a live response structure for a US 10Y query using a query parameter for the API key. Copy exactly as shown below when you need to replicate this specific live sample:

Endpoint: Historical (yield on a specific date)

Query the yield for a single maturity on a given date. Use cases: backfills, event studies, T+N validation.

cURL

JSON response

Interpretation: yield is percent; date is the requested calendar day; source clarifies provenance.

Python (requests)

import requests

params = {"country": "SG", "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)
j = r.json()
print("SG 10Y on", j["date"], "=", j["yield"], "%")

JavaScript (fetch)

const params = new URLSearchParams({
country: "SG", maturity: "10Y", date: "2025-06-15"
});

fetch("https://bonds-api.com/api/v1/historical?" + params.toString(), {
headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(r => r.json()).then(j => {
console.log(`SG 10Y on ${j.date} = ${j.yield}%`);
});

PHP (file_get_contents)

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

Endpoint: Time series (daily yields between dates)

Fetch a continuous daily series for a maturity between two dates. Use cases: charting, rolling metrics, backtests.

cURL

JSON response

The series array contains business-day observations when data is available; weekends/holidays are omitted.

Python (requests)

import requests

q = {
"country": "SG",
"maturity": "10Y",
"start": "2025-10-03",
"end": "2026-10-03"
}
r = requests.get("https://bonds-api.com/api/v1/timeseries",
headers={"X-API-Key": "YOUR_API_KEY"},
params=q)
series = r.json()["series"]
# Example: compute simple average
avg = sum(pt["yield"] for pt in series) / len(series)
print("Avg SG 10Y:", round(avg, 3), "%")

JavaScript (fetch)

const qs = new URLSearchParams({
country: "SG", maturity: "10Y",
start: "2025-10-03", end: "2026-10-03"
});

fetch("https://bonds-api.com/api/v1/timeseries?" + qs.toString(), {
headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(r => r.json()).then(j => {
const dates = j.series.map(p => p.date);
const values = j.series.map(p => p.yield);
console.log("Points:", dates.length, "First:", dates[0], values[0]);
});

PHP (file_get_contents)

<?php
$params = http_build_query([
'country' => 'SG',
'maturity' => '10Y',
'start' => '2025-10-03',
'end' => '2026-10-03'
]);
$ctx = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "X-API-Key: YOUR_API_KEY\r\n"
]
]);
$res = file_get_contents("https://bonds-api.com/api/v1/timeseries?$params", false, $ctx);
$j = json_decode($res, true);
echo "Count: " . count($j['series']) . "\n";

Endpoint: Intraday (snapshots within a day)

Get multiple intraday snapshots for a given maturity and date. Use cases: monitoring liquidity and volatility, constructing intraday curves.

cURL

JSON response

Interpretation:

  • snapshots[].yield: percent yield at the fetch moment
  • snapshots[].fetched_at: UTC timestamp (ISO-8601)
  • count: number of snapshots returned
  • meta.timezone: timezone for timestamps

Python (requests)

import requests
from statistics import pstdev

params = {"country": "SG", "maturity": "10Y", "date": "2026-10-03"}
r = requests.get("https://bonds-api.com/api/v1/intraday",
headers={"X-API-Key": "YOUR_API_KEY"},
params=params)
j = r.json()
vals = [s["yield"] for s in j["snapshots"]]
print("Intraday min/max:", min(vals), max(vals), "Stdev:", round(pstdev(vals), 4))

JavaScript (fetch)

const p = new URLSearchParams({
country: "SG", maturity: "10Y", date: "2026-10-03"
});
fetch("https://bonds-api.com/api/v1/intraday?" + p.toString(), {
headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(r => r.json()).then(j => {
const points = j.snapshots.map(s => [s.fetched_at, s.yield]);
console.log("First snapshot:", points[0]);
});

PHP (file_get_contents)

<?php
$params = http_build_query([
'country' => 'SG',
'maturity' => '10Y',
'date' => '2026-10-03'
]);
$ctx = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "X-API-Key: YOUR_API_KEY\r\n"
]
]);
$res = file_get_contents("https://bonds-api.com/api/v1/intraday?$params", false, $ctx);
$j = json_decode($res, true);
echo "Snapshots: " . $j['count'] . "\n";

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

Summarize how a maturity moved over a period, including start/end yield, absolute change, and range. Use cases: performance summaries, risk oversight.

cURL

JSON response

Interpretation:

  • start_yield/end_yield: percent at period boundaries
  • change: end minus start in percentage points
  • min/max: extrema within the date range

Python (requests)

import requests

p = {"countries": "SG", "maturity": "10Y", "start": "2025-10-03", "end": "2026-10-03"}
r = requests.get("https://bonds-api.com/api/v1/fluctuation",
headers={"X-API-Key": "YOUR_API_KEY"},
params=p)
j = r.json()
sg = j["data"]["SG"]
print("Δ SG 10Y:", sg["change"], "pp; range:", sg["min"], "-", sg["max"])

JavaScript (fetch)

const sp = new URLSearchParams({
countries: "SG", maturity: "10Y", start: "2025-10-03", end: "2026-10-03"
});

fetch("https://bonds-api.com/api/v1/fluctuation?" + sp.toString(), {
headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(r => r.json()).then(j => {
const d = j.data.SG;
console.log(`Start ${d.start_yield} End ${d.end_yield} Change ${d.change}`);
});

PHP (file_get_contents)

<?php
$params = http_build_query([
'countries' => 'SG',
'maturity' => '10Y',
'start' => '2025-10-03',
'end' => '2026-10-03'
]);
$ctx = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "X-API-Key: YOUR_API_KEY\r\n"
]
]);
$res = file_get_contents("https://bonds-api.com/api/v1/fluctuation?$params", false, $ctx);
$j = json_decode($res, true);
$sg = $j['data']['SG'];
echo "Change: " . $sg['change'] . "pp, min: " . $sg['min'] . ", max: " . $sg['max'] . "\n";

Endpoint: Spread (vs benchmark)

Compute Singapore’s yield spread vs a benchmark country at a chosen maturity (default 10Y). Use cases: relative value, cross-market monitoring.

cURL

JSON response

Interpretation:

  • spread_bps: country_yield - benchmark_yield in basis points
  • country_yield/benchmark_yield: both in percent

Python (requests)

import requests

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

JavaScript (fetch)

const qp = new URLSearchParams({
country: "SG", benchmark: "US", maturity: "10Y"
});

fetch("https://bonds-api.com/api/v1/spread?" + qp.toString(), {
headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(r => r.json()).then(j => {
console.log(`Spread: ${j.spread_bps} bps (SG ${j.country_yield}% vs US ${j.benchmark_yield}%)`);
});

PHP (file_get_contents)

<?php
$params = http_build_query([
'country' => 'SG',
'benchmark' => 'US',
'maturity' => '10Y'
]);
$ctx = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "X-API-Key: YOUR_API_KEY\r\n"
]
]);
$res = file_get_contents("https://bonds-api.com/api/v1/spread?$params", false, $ctx);
$j = json_decode($res, true);
echo "Spread (bps): " . $j['spread_bps'] . "\n";

Endpoint: Curve (full yield curve)

Get the full Singapore curve on a date. Use cases: curve construction, fitting, relative value across the term structure.

cURL

JSON response

Interpretation:

  • curve: mapping of maturity tenors to yield (percent)
  • inverted: boolean indicating whether curve is flagged as inverted
  • date: valuation date of the curve

Python (requests)

import requests

r = requests.get("https://bonds-api.com/api/v1/curve",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"country": "SG"})
j = r.json()
tenors = list(j["curve"].keys())
yields = list(j["curve"].values())
print("Curve date:", j["date"], "Inverted:", j["inverted"])
print("Tenors:", tenors)

JavaScript (fetch)

fetch("https://bonds-api.com/api/v1/curve?country=SG", {
headers: { "X-API-Key": "YOUR_API_KEY" }
}).then(r => r.json()).then(j => {
console.log("Curve date:", j.date, "Inverted:", j.inverted);
console.log("10Y:", j.curve["10Y"]);
});

PHP (file_get_contents)

<?php
$params = http_build_query([ 'country' => 'SG' ]);
$ctx = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "X-API-Key: YOUR_API_KEY\r\n"
]
]);
$res = file_get_contents("https://bonds-api.com/api/v1/curve?$params", false, $ctx);
$j = json_decode($res, true);
echo "SG curve 10Y: " . $j['curve']['10Y'] . "%\n";

Endpoint: Building a yield curve with latest vs. curve endpoints

Two approaches exist:

  • Single-call: use /curve for a complete curve on one date, as shown above.
  • Multi-maturity latest: use /latest with maturities=1M,3M,6M,1Y,2Y,5Y,10Y,30Y for a current set. This is useful if you only want a subset or if you’re refreshing a real-time dashboard and prefer current-day official snapshots as they update per maturity.

For curve smoothing or interpolations, fetch /curve as the canonical daily curve and blend with intraday signals from /latest (and /intraday for select tenors). When combining, align on dates and clearly indicate whether values are end-of-day or intraday snapshots to avoid mixing regimes.

Operational considerations: calendars, updates, and caching

Business days and holidays: Daily endpoints skip weekends and Singapore public holidays. The /timeseries will thus present non-contiguous calendar dates; use your favorite business-day calendar utilities for gap-aware analytics.

Update frequency: The /latest endpoint reflects the newest available official or market snapshot. The /intraday endpoint offers multiple within-day points as shown; timestamps are in UTC. For portfolio or VaR runs, prefer the official close date from /latest, and for execution monitoring, enrich with /intraday.

Caching: If you poll frequently, cache identical queries (same country, maturity, and dates) for a short TTL to reduce latency and stay within rate limits. For example, cache /curve for the current date for a few minutes during trading hours; cache /timeseries results for hours or days when querying historical spans.

Error handling: Bonds API errors share a consistent shape: success=false and an error message. Common HTTP statuses include 401 (missing/invalid key), 403 (quota exceeded), 404 (no data for the requested country/maturity/date), 422 (invalid parameter), 429 (rate limit exceeded), and 500 (server error). Always check the success flag before parsing payloads and handle retries/backoff for 429/500.

Explore more at https://bonds-api.com and schema tooling at MCP.

Endpoint: Putting it together for real workloads

Below are quick patterns for common fixed-income tasks.

  • Live dashboard for SG: call /latest for 1M, 3M, 6M, 1Y, 2Y, 5Y, 10Y, 30Y every few minutes; render cards for each tenor; apply color coding for d/d changes from /fluctuation (start=today-1, end=today).
  • Intraday surveillance: poll /intraday for a limited set (e.g., 2Y and 10Y) during Singapore trading hours; compute realized ranges and volatility; trigger alerts when yields break prior-day max/min from /fluctuation.
  • Backtesting: pull long /timeseries for 10Y to compute rolling carry/roll-down proxies; complement with /curve snapshots to estimate forward curve differentials.
  • Cross-market RV: use /spread vs US 10Y to monitor changes in SG—US differentials in bps; add thresholds to flag deviations from a moving average.

Endpoint: Additional complete examples for completeness

This section reiterates “how to call” in three languages with explicit parameter handling for each endpoint. Use these as templates in your apps.

Latest (Python/JS/PHP)

# Python
import requests
r = requests.get("https://bonds-api.com/api/v1/latest",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"countries": "SG", "maturities": "2Y,10Y"})
print(r.json())
// JavaScript
const u = new URL("https://bonds-api.com/api/v1/latest");
u.search = new URLSearchParams({ countries: "SG", maturities: "2Y,10Y" }).toString();
fetch(u, { headers: { "X-API-Key": "YOUR_API_KEY" } }).then(r => r.json()).then(console.log);
<?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/latest?countries=SG&maturities=2Y,10Y", false, $ctx);

Historical (Python/JS/PHP)

# Python
import requests
print(requests.get("https://bonds-api.com/api/v1/historical",
headers={"X-API-Key":"YOUR_API_KEY"},
params={"country":"SG","maturity":"10Y","date":"2025-06-15"}).json())
// JavaScript
fetch("https://bonds-api.com/api/v1/historical?country=SG&maturity=10Y&date=2025-06-15",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }).then(r => r.json()).then(console.log);
<?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/historical?country=SG&maturity=10Y&date=2025-06-15", false, $ctx);

Time series (Python/JS/PHP)

# Python
import requests
print(requests.get("https://bonds-api.com/api/v1/timeseries",
headers={"X-API-Key":"YOUR_API_KEY"},
params={"country":"SG","maturity":"10Y","start":"2025-10-03","end":"2026-10-03"}).json())
// JavaScript
fetch("https://bonds-api.com/api/v1/timeseries?country=SG&maturity=10Y&start=2025-10-03&end=2026-10-03",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }).then(r => r.json()).then(console.log);
<?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/timeseries?country=SG&maturity=10Y&start=2025-10-03&end=2026-10-03", false, $ctx);

Intraday (Python/JS/PHP)

# Python
import requests
print(requests.get("https://bonds-api.com/api/v1/intraday",
headers={"X-API-Key":"YOUR_API_KEY"},
params={"country":"SG","maturity":"10Y","date":"2026-10-03"}).json())
// JavaScript
fetch("https://bonds-api.com/api/v1/intraday?country=SG&maturity=10Y&date=2026-10-03",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }).then(r => r.json()).then(console.log);
<?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/intraday?country=SG&maturity=10Y&date=2026-10-03", false, $ctx);

Fluctuation (Python/JS/PHP)

# Python
import requests
print(requests.get("https://bonds-api.com/api/v1/fluctuation",
headers={"X-API-Key":"YOUR_API_KEY"},
params={"countries":"SG","maturity":"10Y","start":"2025-10-03","end":"2026-10-03"}).json())
// JavaScript
fetch("https://bonds-api.com/api/v1/fluctuation?countries=SG&maturity=10Y&start=2025-10-03&end=2026-10-03",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }).then(r => r.json()).then(console.log);
<?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/fluctuation?countries=SG&maturity=10Y&start=2025-10-03&end=2026-10-03", false, $ctx);

Spread (Python/JS/PHP)

# Python
import requests
print(requests.get("https://bonds-api.com/api/v1/spread",
headers={"X-API-Key":"YOUR_API_KEY"},
params={"country":"SG","benchmark":"US","maturity":"10Y"}).json())
// JavaScript
fetch("https://bonds-api.com/api/v1/spread?country=SG&benchmark=US&maturity=10Y",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }).then(r => r.json()).then(console.log);
<?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/spread?country=SG&benchmark=US&maturity=10Y", false, $ctx);

Curve (Python/JS/PHP)

# Python
import requests
print(requests.get("https://bonds-api.com/api/v1/curve",
headers={"X-API-Key":"YOUR_API_KEY"},
params={"country":"SG"}).json())
// JavaScript
fetch("https://bonds-api.com/api/v1/curve?country=SG",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }).then(r => r.json()).then(console.log);
<?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=SG", false, $ctx);

Practical modeling: Singapore curve and spreads

With /curve, you can export the entire SG curve for curve-fitting (e.g., cubic spline, NSS) and then map risk across buckets. For monitoring, pair /latest for headline tenors (e.g., 2Y and 10Y) with /spread against US for a concise, cross-market view. For risk, compute VaR drivers from /timeseries and calibrate intraday triggers from /intraday snapshots.

All examples above are sourced from bonds-api.com. To deploy in production, secure your API key and follow the GET patterns shown with the X-API-Key header.

FAQ

Q: Are yields returned in percent or basis points?
A: Yields are in percent (e.g., 4.52 = 4.52%). The /spread endpoint returns spread_bps in basis points.

Q: How do I handle Singapore non-trading days?
A: Daily series skip weekends and SG public holidays. When computing returns or rolling stats, use business-day calendars and avoid assuming daily continuity.

Q: What timezone are intraday timestamps?
A: Intraday “fetched_at” is UTC (see meta.timezone). Convert to Asia/Singapore for local session analytics.

Q: Can I get a full curve for a historical date?
A: Yes. Call /curve with country=SG and a date=YYYY-MM-DD to retrieve the curve for that day (if available). If date is omitted, the latest curve is returned.

Q: What errors should I expect and how should I handle them?
A: Common ones include 401 (missing/invalid key), 422 (bad parameters), 404 (no data for your selection), 429 (rate limit), and 500 (server). Always check the “success” flag and implement retries/backoff for 429/500.

Ready to ship Singapore fixed-income analytics with intraday and fluctuation data? Get your API key here: Register and explore endpoint schemas and tools in the MCP.

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.