> TickerLayer documentation for AI agents and LLMs, the Markdown version of https://tickerlayer.com/docs/products/bonds
> REST base URL https://api.tickerlayer.com, API key in the `x-api-key` header. WebSocket wss://stream.tickerlayer.com?apiKey=YOUR_API_KEY.
> Any docs page reads as Markdown at its URL plus `.md`. Index: https://tickerlayer.com/llms.txt · Full API reference: https://tickerlayer.com/llms-full.txt

# Bonds

Latest sovereign yield curve rates for supported country and tenor pairs.

- **Auth:** x-api-key header
- **Base path:** /bond
- **WebSocket:** bonds.quotes
- **Symbol format:** CC:TENOR (e.g. US:10Y)

**Bonds is a data add-on:** $39/mo on Individual, $349/mo on Business, on its own or alongside your plan. [Get it on the add-ons page](https://tickerlayer.com/data-addons#bonds)

Rates are percentages, one official observation per business day. A short upstream interruption still returns the last good value.

## Symbols

- **US** (Treasury curve): 1M, 3M, 6M, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 20Y, 30Y
- **DE · ES · FR · IT · UK** (EU and UK sovereign curves): 1Y, 2Y, 3Y, 5Y, 10Y, 30Y

## Latest yield

**Endpoint:** `GET /bond/last/:symbol`

Latest available yield curve rate for a supported country and tenor.

### Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `symbol` | string | Yes | Bond yield symbol in CC:TENOR format. US tenors support 1M, 3M, 6M, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 20Y, and 30Y. DE, ES, FR, IT, and UK support 1Y, 2Y, 3Y, 5Y, 10Y, and 30Y. |

### Request

```bash
curl -sS "https://api.tickerlayer.com/bond/last/US:30Y" \
  -H "x-api-key: <YOUR_API_KEY>"
```

```python
import requests

res = requests.get(
    "https://api.tickerlayer.com/bond/last/US:30Y",
    headers={"x-api-key": "<YOUR_API_KEY>"},
)
print(res.json())
```

```javascript
const res = await fetch("https://api.tickerlayer.com/bond/last/US:30Y", {
  headers: { "x-api-key": "<YOUR_API_KEY>" },
});
const data = await res.json();
console.log(data);
```

```go
req, _ := http.NewRequest("GET", "https://api.tickerlayer.com/bond/last/US:30Y", nil)
req.Header.Set("x-api-key", "<YOUR_API_KEY>")
```

### Response

```json
{
  "symbol": "US:30Y",
  "rate": 4.86,
  "unit": "percent",
  "date": "2026-06-25",
  "timestamp": 1782345600000
}
```

### Notes

`400 invalid symbol` for malformed symbols. `404 symbol not available` for unsupported country or tenor pairs. `503 market data temporarily unavailable` when no current or cached value is available.

## Snapshot

**Endpoint:** `GET /bond/snapshot/:symbol`

Latest yield plus the previous published observation and the change between them.

### Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `symbol` | string | Yes | Bond yield symbol in CC:TENOR format. US tenors support 1M, 3M, 6M, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 20Y, and 30Y. DE, ES, FR, IT, and UK support 1Y, 2Y, 3Y, 5Y, 10Y, and 30Y. |

### Request

```bash
curl -sS "https://api.tickerlayer.com/bond/snapshot/US:30Y" \
  -H "x-api-key: <YOUR_API_KEY>"
```

```python
import requests

res = requests.get(
    "https://api.tickerlayer.com/bond/snapshot/US:30Y",
    headers={"x-api-key": "<YOUR_API_KEY>"},
)
print(res.json())
```

```javascript
const res = await fetch("https://api.tickerlayer.com/bond/snapshot/US:30Y", {
  headers: { "x-api-key": "<YOUR_API_KEY>" },
});
const data = await res.json();
console.log(data);
```

```go
req, _ := http.NewRequest("GET", "https://api.tickerlayer.com/bond/snapshot/US:30Y", nil)
req.Header.Set("x-api-key", "<YOUR_API_KEY>")
```

### Response

```json
{
  "symbol": "US:30Y",
  "rate": 4.86,
  "unit": "percent",
  "date": "2026-06-25",
  "timestamp": 1782345600000,
  "prev_rate": 4.83,
  "prev_date": "2026-06-24",
  "prev_timestamp": 1782259200000,
  "change": 0.03,
  "change_bps": 3,
  "change_percent": 0.6211
}
```

### Notes

`change` is the move in percentage points versus the previous observation, `change_bps` is the same move in basis points, and `change_percent` is the relative move versus `prev_rate`. Both observations are dated, so `prev_date` tells you the interval the change covers: consecutive business days for most curves, and the previous auction for the short-term Italy tenors, which publish monthly. The `prev_*` and change fields are `null` when only a single observation is available yet. Errors match the latest rate endpoint.

## WebSocket

Subscribe to `bonds.quotes` with the same `CC:TENOR` symbols. Bonds access on your account covers the channel as well as the REST endpoints.

- **Daily, not ticks:** Right after the subscribe acknowledgement the latest published rate is replayed with `snapshot: true`; then one frame per symbol for each new observation, in practice once per business day. Silence in between is normal, not a stalled stream.
- **Fields:** Those of `/bond/snapshot` except `prev_timestamp`. `ts` and `timestamp` are the observation date, never the send time.

**Subscribe**

```json
{
  "action": "subscribe",
  "channels": ["bonds.quotes"],
  "symbols": ["US:10Y", "DE:10Y"]
}
```

**rate frame (replayed on subscribe)**

```json
{
  "type": "rate",
  "channel": "bonds.quotes",
  "asset": "bonds",
  "symbol": "US:10Y",
  "rate": 4.79,
  "unit": "percent",
  "date": "2026-09-02",
  "prev_rate": 4.76,
  "prev_date": "2026-09-01",
  "change": 0.03,
  "change_bps": 3,
  "change_percent": 0.6303,
  "ts": 1788307200000,
  "timestamp": 1788307200000,
  "snapshot": true
}
```
